)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"9723561337a1932eabb552d6e75532796b27de43","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"7af0df5a_79ceae08","updated":"2026-06-11 14:45:17.000000000","message":"This looks pretty good to me. I would prefer a unit test for timeout but I\u0027m also fine with leaving it like this.\n\nI was afraid of a potential race condition in ThreadResult but I tested with 300,000+ operations and no race found because CPython\u0027s thread.join() provides sufficient memory barrier.\n\nI also tested the behavior when deadline expires (remaining \u003c\u003d0) and wait(timeout\u003d0) correctly returns result if thread already completed, times out if still running. Perfect for deadline scenarios.","commit_id":"3c4ff69310d0b5d73c7444c1f8746a28e9e82b47"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"836fcb9e76bde62dfc25c795a868dfead644089a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"86660b1b_4ec63343","updated":"2026-07-11 09:16:14.000000000","message":"recheck\n\numount /mnt/sdb1: target is busy","commit_id":"2aad24f54112b193b45336834a7e0cb045e945ee"}],"swift/common/concurrency.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":103,"context_line":"        def dead(self):"},{"line_number":104,"context_line":"            return self._gt.dead"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        def wait(self, timeout\u003dNone):"},{"line_number":107,"context_line":"            if timeout is not None:"},{"line_number":108,"context_line":"                with Timeout(timeout):"},{"line_number":109,"context_line":"                    return self._gt.wait()"}],"source_content_type":"text/x-python","patch_set":17,"id":"8d305a23_8df06b18","line":106,"updated":"2026-07-13 20:19:16.000000000","message":"Come to think of it, it\u0027s kinda weird that eventlet\u0027s `GreenThread.wait` doesn\u0027t already support a `timeout` kwarg...","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"d3eb66d8214c4101e8aa585ba026485da8df646e","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        def dead(self):"},{"line_number":104,"context_line":"            return self._gt.dead"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        def wait(self, timeout\u003dNone):"},{"line_number":107,"context_line":"            if timeout is not None:"},{"line_number":108,"context_line":"                with Timeout(timeout):"},{"line_number":109,"context_line":"                    return self._gt.wait()"}],"source_content_type":"text/x-python","patch_set":17,"id":"1aa163c5_9c01c61b","line":106,"in_reply_to":"8d305a23_8df06b18","updated":"2026-08-21 08:33:10.000000000","message":"Agreed. Left the wrapper as is - it\u0027s the only place we need a timeout on wait().","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":190,"context_line":"    # Helper functions to replace eventlet spawn with a threading equivalent"},{"line_number":191,"context_line":"    _spawn_kill_local \u003d threading.local()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    class ThreadResult(object):"},{"line_number":194,"context_line":"        def __init__(self, func, args, kwargs):"},{"line_number":195,"context_line":"            self.result \u003d None"},{"line_number":196,"context_line":"            self.exc \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"f59dbb17_b384152e","line":193,"updated":"2026-07-13 20:19:16.000000000","message":"I kinda wonder if we might want to inherit from `threading.Thread` -- and maybe rename to `ThreadWithResult`","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"d3eb66d8214c4101e8aa585ba026485da8df646e","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    # Helper functions to replace eventlet spawn with a threading equivalent"},{"line_number":191,"context_line":"    _spawn_kill_local \u003d threading.local()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    class ThreadResult(object):"},{"line_number":194,"context_line":"        def __init__(self, func, args, kwargs):"},{"line_number":195,"context_line":"            self.result \u003d None"},{"line_number":196,"context_line":"            self.exc \u003d None"}],"source_content_type":"text/x-python","patch_set":17,"id":"e1e277d1_e3381686","line":193,"in_reply_to":"f59dbb17_b384152e","updated":"2026-08-21 08:33:10.000000000","message":"Done in 1001762: Address remaining review comments on the eventlet-removal series | https://review.opendev.org/c/openstack/swift/+/1001762","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    class ThreadResult(object):"},{"line_number":194,"context_line":"        def __init__(self, func, args, kwargs):"},{"line_number":195,"context_line":"            self.result \u003d None"},{"line_number":196,"context_line":"            self.exc \u003d None"},{"line_number":197,"context_line":"            self._kill_hook \u003d None"},{"line_number":198,"context_line":"            self.thread \u003d threading.Thread("}],"source_content_type":"text/x-python","patch_set":17,"id":"57c57735_72ecd163","line":195,"updated":"2026-07-13 20:19:16.000000000","message":"Might be better to have some dedicated `INCOMPLETE \u003d object()` singleton for in-progress threads -- surely some might legitimately return `None`, right?","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"d3eb66d8214c4101e8aa585ba026485da8df646e","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    class ThreadResult(object):"},{"line_number":194,"context_line":"        def __init__(self, func, args, kwargs):"},{"line_number":195,"context_line":"            self.result \u003d None"},{"line_number":196,"context_line":"            self.exc \u003d None"},{"line_number":197,"context_line":"            self._kill_hook \u003d None"},{"line_number":198,"context_line":"            self.thread \u003d threading.Thread("}],"source_content_type":"text/x-python","patch_set":17,"id":"3eedf3e6_ecfc86bf","line":195,"in_reply_to":"57c57735_72ecd163","updated":"2026-08-21 08:33:10.000000000","message":"Done in 1001762: Address remaining review comments on the eventlet-removal series | https://review.opendev.org/c/openstack/swift/+/1001762","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":201,"context_line":"            self.thread.start()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        def run(self, func, args, kwargs):"},{"line_number":204,"context_line":"            _spawn_kill_local.handle \u003d self"},{"line_number":205,"context_line":"            try:"},{"line_number":206,"context_line":"                self.result \u003d func(*args, **kwargs)"},{"line_number":207,"context_line":"            except BaseException as e:"}],"source_content_type":"text/x-python","patch_set":17,"id":"089657c1_1a4e099f","line":204,"updated":"2026-07-13 20:19:16.000000000","message":"I don\u0027t understand how this is getting used.","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"97e5dc5690d8b376efeccac974e03e3fd4ea1679","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            self.thread.start()"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        def run(self, func, args, kwargs):"},{"line_number":204,"context_line":"            _spawn_kill_local.handle \u003d self"},{"line_number":205,"context_line":"            try:"},{"line_number":206,"context_line":"                self.result \u003d func(*args, **kwargs)"},{"line_number":207,"context_line":"            except BaseException as e:"}],"source_content_type":"text/x-python","patch_set":17,"id":"e4c5e9e6_0d75aab3","line":204,"in_reply_to":"089657c1_1a4e099f","updated":"2026-07-22 15:10:24.000000000","message":"This is used later in the series (in 979790).","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        def wait(self, timeout\u003dNone):"},{"line_number":213,"context_line":"            self.thread.join(timeout\u003dtimeout)"},{"line_number":214,"context_line":"            if self.thread.is_alive():"},{"line_number":215,"context_line":"                raise Timeout(timeout)"},{"line_number":216,"context_line":"            if self.exc:"},{"line_number":217,"context_line":"                raise self.exc"},{"line_number":218,"context_line":"            return self.result"}],"source_content_type":"text/x-python","patch_set":17,"id":"34e062e5_f5e56d3b","line":215,"updated":"2026-07-13 20:19:16.000000000","message":"Right; *our* `Timeout`, not `TimeoutError` 👍","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":214,"context_line":"            if self.thread.is_alive():"},{"line_number":215,"context_line":"                raise Timeout(timeout)"},{"line_number":216,"context_line":"            if self.exc:"},{"line_number":217,"context_line":"                raise self.exc"},{"line_number":218,"context_line":"            return self.result"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        @property"}],"source_content_type":"text/x-python","patch_set":17,"id":"c79d68eb_e516276d","line":217,"updated":"2026-07-13 20:19:16.000000000","message":"I want to see what these tracebacks look like.","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"97e5dc5690d8b376efeccac974e03e3fd4ea1679","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            if self.thread.is_alive():"},{"line_number":215,"context_line":"                raise Timeout(timeout)"},{"line_number":216,"context_line":"            if self.exc:"},{"line_number":217,"context_line":"                raise self.exc"},{"line_number":218,"context_line":"            return self.result"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        @property"}],"source_content_type":"text/x-python","patch_set":17,"id":"75b461c5_5e0daced","line":217,"in_reply_to":"c79d68eb_e516276d","updated":"2026-07-22 15:10:24.000000000","message":"Here is a sample, run it with `USE_EVENTLET\u003dFalse python3 demo.py`: \n\n```\nfrom swift.common.concurrency import spawn\nfrom swift.common.bufferedhttp import http_connect\nimport traceback\n\ndef async_update():\n    # 192.0.2.1 \u003d TEST-NET-1 (RFC 5737), unroutable -\u003e connect times out\n    conn \u003d http_connect(\u0027192.0.2.1\u0027, 6201, \u0027sdb1\u0027, 1, \u0027PUT\u0027,\n                        \u0027/AUTH_test/c/o\u0027, headers\u003d{\u0027X-Timestamp\u0027: \u00271\u0027},\n                        timeout\u003d0.05)\n    return conn.getresponse()\n\ngt \u003d spawn(async_update)\ntry:\n    gt.wait()\nexcept BaseException:\n    traceback.print_exc()\n\n```\n\nOutput looks like this:\n```\nTraceback (most recent call last):\n  File \"...swift/demo.py\", line 14, in \u003cmodule\u003e\n    gt.wait()\n  File \"...swift/swift/common/concurrency.py\", line 402, in wait\n    raise self.exc\n  File \"...swift/swift/common/concurrency.py\", line 391, in run \n    self.result \u003d func(*args, **kwargs)\n  File \"...swift/demo.py\", line 7, in async_update\n    conn \u003d http_connect(\u0027192.0.2.1\u0027, 6201, \u0027sdb1\u0027, 1, \u0027PUT\u0027,\n                        \u0027/AUTH_test/c/o\u0027, headers\u003d{\u0027X-Timestamp\u0027: \u00271\u0027},\n                        timeout\u003d0.05)\n  File \"...swift/swift/common/bufferedhttp.py\", line 264, in http_connect\n    return http_connect_raw(\n        ipaddr, port, method, path, headers, query_string, ssl, timeout)\n  File \"...swift/swift/common/bufferedhttp.py\", line 304, in http_connect_raw\n    conn.endheaders()\n  File \"/usr/lib64/python3.14/http/client.py\", line 1362, in endheaders\n    self._send_output(message_body, encode_chunked\u003dencode_chunked)\n  File \"/usr/lib64/python3.14/http/client.py\", line 1122, in _send_output\n    self.send(msg)\n  File \"/usr/lib64/python3.14/http/client.py\", line 1066, in send\n    self.connect()\n  File \"...swift/swift/common/bufferedhttp.py\", line 195, in connect\n    ret \u003d HTTPConnection.connect(self)\n  File \"/usr/lib64/python3.14/http/client.py\", line 1032, in connect\n    self.sock \u003d self._create_connection(\n        (self.host,self.port), self.timeout, self.source_address)\n  File \"/usr/lib64/python3.14/socket.py\", line 874, in create_connection\n    raise exceptions[0]\n  File \"/usr/lib64/python3.14/socket.py\", line 859, in create_connection\n    sock.connect(sa)\nTimeoutError: timed out\n```","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        def kill(self):"},{"line_number":225,"context_line":"            # Real threads can\u0027t be interrupted, but a stoppable callable can"},{"line_number":226,"context_line":"            # register a stop hook via register_kill_hook() -- the threading"},{"line_number":227,"context_line":"            # analogue of GreenThread.kill(). With no hook the daemon thread"},{"line_number":228,"context_line":"            # keeps running: it won\u0027t block interpreter exit, but it may"},{"line_number":229,"context_line":"            # still mutate shared state or hold resources until it returns."}],"source_content_type":"text/x-python","patch_set":17,"id":"d23ef218_0c8aae57","line":226,"range":{"start_line":226,"start_character":39,"end_line":226,"end_character":57},"updated":"2026-07-13 20:19:16.000000000","message":"What\u0027s this now? I\u0027m not seeing where this is defined...","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"97e5dc5690d8b376efeccac974e03e3fd4ea1679","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"        def kill(self):"},{"line_number":225,"context_line":"            # Real threads can\u0027t be interrupted, but a stoppable callable can"},{"line_number":226,"context_line":"            # register a stop hook via register_kill_hook() -- the threading"},{"line_number":227,"context_line":"            # analogue of GreenThread.kill(). With no hook the daemon thread"},{"line_number":228,"context_line":"            # keeps running: it won\u0027t block interpreter exit, but it may"},{"line_number":229,"context_line":"            # still mutate shared state or hold resources until it returns."}],"source_content_type":"text/x-python","patch_set":17,"id":"4d979414_69419d7a","line":226,"range":{"start_line":226,"start_character":39,"end_line":226,"end_character":57},"in_reply_to":"d23ef218_0c8aae57","updated":"2026-07-22 15:10:24.000000000","message":"This is used later in the series (in 979790).","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":5608,"context_line":""},{"line_number":5609,"context_line":"        def kill(self, exception\u003dGreenletExit):"},{"line_number":5610,"context_line":"            # Throw an exception into the currently thread to kill it"},{"line_number":5611,"context_line":"            ctypes.pythonapi.PyThreadState_SetAsyncExc("},{"line_number":5612,"context_line":"                self.thread.ident, ctypes.py_object(exception))"},{"line_number":5613,"context_line":""},{"line_number":5614,"context_line":"    def spawn(func, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"73ff80b8_dd63b748","line":5611,"updated":"2026-07-13 20:19:16.000000000","message":"🤩\n\nDocs at https://docs.python.org/3/c-api/threads.html#c.PyThreadState_SetAsyncExc\n\n... which say\n\n\u003e To prevent naive misuse, you must write your own C extension to call this.\n\nI guess \"must\" was a little strong. How naive are we feeling? 😜\n\nProbably for the best that we backed away from this, at least for now.","commit_id":"4ba4e9e0f02f014183251f3ac9cf155e0eeb2d2c"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"d3eb66d8214c4101e8aa585ba026485da8df646e","unresolved":false,"context_lines":[{"line_number":5608,"context_line":""},{"line_number":5609,"context_line":"        def kill(self, exception\u003dGreenletExit):"},{"line_number":5610,"context_line":"            # Throw an exception into the currently thread to kill it"},{"line_number":5611,"context_line":"            ctypes.pythonapi.PyThreadState_SetAsyncExc("},{"line_number":5612,"context_line":"                self.thread.ident, ctypes.py_object(exception))"},{"line_number":5613,"context_line":""},{"line_number":5614,"context_line":"    def spawn(func, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"a88e0a73_cc57904f","line":5611,"in_reply_to":"73ff80b8_dd63b748","updated":"2026-08-21 08:33:10.000000000","message":"Gone. kill() only calls a stop hook now, if the callable registered one.","commit_id":"4ba4e9e0f02f014183251f3ac9cf155e0eeb2d2c"}],"swift/obj/replicator.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":1141,"context_line":"            self.is_multiprocess_worker \u003d True"},{"line_number":1142,"context_line":"            self._emplace_log_prefix(multiprocess_worker_index)"},{"line_number":1143,"context_line":"        self.logger.info(\"Starting object replicator in daemon mode.\")"},{"line_number":1144,"context_line":"        spawn_n(self._child_process_reaper)"},{"line_number":1145,"context_line":"        # Run the replicator continually"},{"line_number":1146,"context_line":"        while True:"},{"line_number":1147,"context_line":"            self._zero_stats()"}],"source_content_type":"text/x-python","patch_set":17,"id":"721980b1_16966878","line":1144,"updated":"2026-07-13 20:19:16.000000000","message":"Part of me wants to just replace this with `spawn` -- even if we never look for results/exceptions, this is a one-off in a background daemon: we don\u0027t really care about eventlet\u0027s professed speed improvements.","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"d3eb66d8214c4101e8aa585ba026485da8df646e","unresolved":false,"context_lines":[{"line_number":1141,"context_line":"            self.is_multiprocess_worker \u003d True"},{"line_number":1142,"context_line":"            self._emplace_log_prefix(multiprocess_worker_index)"},{"line_number":1143,"context_line":"        self.logger.info(\"Starting object replicator in daemon mode.\")"},{"line_number":1144,"context_line":"        spawn_n(self._child_process_reaper)"},{"line_number":1145,"context_line":"        # Run the replicator continually"},{"line_number":1146,"context_line":"        while True:"},{"line_number":1147,"context_line":"            self._zero_stats()"}],"source_content_type":"text/x-python","patch_set":17,"id":"6fef7fb5_720c67c8","line":1144,"in_reply_to":"721980b1_16966878","updated":"2026-08-21 08:33:10.000000000","message":"Done in 1001762: Address remaining review comments on the eventlet-removal series | https://review.opendev.org/c/openstack/swift/+/1001762","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"}],"test/functional/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":1051,"context_line":"    if in_process:"},{"line_number":1052,"context_line":"        try:"},{"line_number":1053,"context_line":"            for i, server in enumerate(_test_coros):"},{"line_number":1054,"context_line":"                server.kill()"},{"line_number":1055,"context_line":"                if not server.dead:"},{"line_number":1056,"context_line":"                    # kill it from the socket level"},{"line_number":1057,"context_line":"                    _test_socks[i].close()"}],"source_content_type":"text/x-python","patch_set":17,"id":"f40f09fe_6c373d19","line":1054,"updated":"2026-07-13 20:19:16.000000000","message":"OK, so with real threads, this won\u0027t do any actual killing right now, yeah? And we\u0027re relying on the `daemon \u003d True` to make sure they eventually get cleaned up?","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"97e5dc5690d8b376efeccac974e03e3fd4ea1679","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"    if in_process:"},{"line_number":1052,"context_line":"        try:"},{"line_number":1053,"context_line":"            for i, server in enumerate(_test_coros):"},{"line_number":1054,"context_line":"                server.kill()"},{"line_number":1055,"context_line":"                if not server.dead:"},{"line_number":1056,"context_line":"                    # kill it from the socket level"},{"line_number":1057,"context_line":"                    _test_socks[i].close()"}],"source_content_type":"text/x-python","patch_set":17,"id":"477ffed7_e9aec5e6","line":1054,"in_reply_to":"f40f09fe_6c373d19","updated":"2026-07-22 15:10:24.000000000","message":"Yes, exactly.","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"}],"test/unit/common/utils/test_spawn.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5a3eae646c802ab70afac934dcf756a0eddffd8e","unresolved":true,"context_lines":[{"line_number":17,"context_line":"from swift.common.concurrency import spawn"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class TestSpawn(unittest.TestCase):"},{"line_number":21,"context_line":"    def test_with_args(self):"},{"line_number":22,"context_line":"        f \u003d lambda x, y: x * y"},{"line_number":23,"context_line":"        result \u003d spawn(f, 6, 7)"}],"source_content_type":"text/x-python","patch_set":17,"id":"2414c8a9_c2071d8f","line":20,"updated":"2026-07-13 20:19:16.000000000","message":"Not going in `test/unit/common/test_concurrency.py`?","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"97e5dc5690d8b376efeccac974e03e3fd4ea1679","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from swift.common.concurrency import spawn"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class TestSpawn(unittest.TestCase):"},{"line_number":21,"context_line":"    def test_with_args(self):"},{"line_number":22,"context_line":"        f \u003d lambda x, y: x * y"},{"line_number":23,"context_line":"        result \u003d spawn(f, 6, 7)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ce05070d_e368ea5c","line":20,"in_reply_to":"2414c8a9_c2071d8f","updated":"2026-07-22 15:10:24.000000000","message":"Acknowledged","commit_id":"c9548d4f68d8ba81386348c24c4dfdb3547b7a82"}]}
