)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"04760640437cb66de2e92ce63040d7527ff01d00","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"62a08dd6_0033744c","updated":"2026-03-13 18:16:43.000000000","message":"recheck\n\nswift-tox-lower-constraints timed out","commit_id":"010be858b3cc2b058a1b98d88e3d104ddd0c6f05"}],"swift/common/threadpool.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":30,"context_line":"        self.max_size \u003d max_size"},{"line_number":31,"context_line":"        self.current_size \u003d 0"},{"line_number":32,"context_line":"        self.free_items \u003d collections.deque()"},{"line_number":33,"context_line":"        self.lock \u003d threading.Lock()"},{"line_number":34,"context_line":"        self.available \u003d threading.Condition(self.lock)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        if create is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"10931ce5_67ba5abe","line":33,"updated":"2026-03-12 20:55:34.000000000","message":"OK, so we specifically *don\u0027t* want an `RLock` -- any particular reason?","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1a808026a5171d7fedc6385339f60cce0d082dc5","unresolved":true,"context_lines":[{"line_number":30,"context_line":"        self.max_size \u003d max_size"},{"line_number":31,"context_line":"        self.current_size \u003d 0"},{"line_number":32,"context_line":"        self.free_items \u003d collections.deque()"},{"line_number":33,"context_line":"        self.lock \u003d threading.Lock()"},{"line_number":34,"context_line":"        self.available \u003d threading.Condition(self.lock)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        if create is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3331b390_b5d73506","line":33,"in_reply_to":"10931ce5_67ba5abe","updated":"2026-03-13 11:37:07.000000000","message":"No particular reason, and indeed RLock should be used here.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a96c7ed031b57403b03fbe18bbbc0276e58d0fd9","unresolved":true,"context_lines":[{"line_number":30,"context_line":"        self.max_size \u003d max_size"},{"line_number":31,"context_line":"        self.current_size \u003d 0"},{"line_number":32,"context_line":"        self.free_items \u003d collections.deque()"},{"line_number":33,"context_line":"        self.lock \u003d threading.Lock()"},{"line_number":34,"context_line":"        self.available \u003d threading.Condition(self.lock)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        if create is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6f50bc87_26b3ce3a","line":33,"in_reply_to":"3331b390_b5d73506","updated":"2026-03-13 15:41:14.000000000","message":"OK, cool -- so then I think we can stop tracking `self.lock` entirely, and just let `self.available \u003d threading.Condition()` create its own lock.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":53,"context_line":"                    self.current_size -\u003d 1"},{"line_number":54,"context_line":"                    raise"},{"line_number":55,"context_line":"                return created"},{"line_number":56,"context_line":"            self.current_size -\u003d 1  # did not create"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"            while not self.free_items:"},{"line_number":59,"context_line":"                # Wait until notified by put"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f917686_2747bd9e","line":56,"updated":"2026-03-12 20:55:34.000000000","message":"WDYT about\n```\ndiff --git a/swift/common/threadpool.py b/swift/common/threadpool.py\nindex d797255a1..50e598e3f 100644\n--- a/swift/common/threadpool.py\n+++ b/swift/common/threadpool.py\n@@ -46,15 +46,14 @@ class Pool(object):\n             if self.free_items:\n                 return self.free_items.popleft()\n\n-            self.current_size +\u003d 1\n-            if self.current_size \u003c\u003d self.max_size:\n+            if self.current_size \u003c self.max_size:\n+                self.current_size +\u003d 1\n                 try:\n                     created \u003d self.create()\n                 except BaseException:\n                     self.current_size -\u003d 1\n                     raise\n                 return created\n-            self.current_size -\u003d 1  # did not create\n\n             while not self.free_items:\n                 # Wait until notified by put\n```\n? Should be equivalent, and one less spot to track `self.current_size`...","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1a808026a5171d7fedc6385339f60cce0d082dc5","unresolved":true,"context_lines":[{"line_number":53,"context_line":"                    self.current_size -\u003d 1"},{"line_number":54,"context_line":"                    raise"},{"line_number":55,"context_line":"                return created"},{"line_number":56,"context_line":"            self.current_size -\u003d 1  # did not create"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"            while not self.free_items:"},{"line_number":59,"context_line":"                # Wait until notified by put"}],"source_content_type":"text/x-python","patch_set":2,"id":"fd53a2f0_e14ac842","line":56,"in_reply_to":"5f917686_2747bd9e","updated":"2026-03-13 11:37:07.000000000","message":"Yes, I agree - this is the cleaner approach.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def put(self, item):"},{"line_number":66,"context_line":"        with self.available:  # acquires the lock"},{"line_number":67,"context_line":"            if self.current_size \u003e self.max_size:"},{"line_number":68,"context_line":"                return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"            self.free_items.append(item)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c39fd_d4e307c9","line":67,"updated":"2026-03-12 20:55:34.000000000","message":"Surely this would represent some programming error, yeah? Why *shouldn\u0027t* we raise a `RuntimeError` instead of quietly dropping `item` on the floor?","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1a808026a5171d7fedc6385339f60cce0d082dc5","unresolved":true,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def put(self, item):"},{"line_number":66,"context_line":"        with self.available:  # acquires the lock"},{"line_number":67,"context_line":"            if self.current_size \u003e self.max_size:"},{"line_number":68,"context_line":"                return"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"            self.free_items.append(item)"}],"source_content_type":"text/x-python","patch_set":2,"id":"15800995_2e72727a","line":67,"in_reply_to":"5f7c39fd_d4e307c9","updated":"2026-03-13 11:37:07.000000000","message":"You\u0027re right - adding a raise RuntimeError in the follow up.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"}],"test/unit/common/test_threadpool.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        def worker():"},{"line_number":61,"context_line":"            try:"},{"line_number":62,"context_line":"                item \u003d pool.get()"},{"line_number":63,"context_line":"                sleep(0.01)"},{"line_number":64,"context_line":"                results.append(item)"},{"line_number":65,"context_line":"                pool.put(item)"},{"line_number":66,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"233dc1b1_9f772332","line":63,"updated":"2026-03-12 20:55:34.000000000","message":"Why the sleep?","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1a808026a5171d7fedc6385339f60cce0d082dc5","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        def worker():"},{"line_number":61,"context_line":"            try:"},{"line_number":62,"context_line":"                item \u003d pool.get()"},{"line_number":63,"context_line":"                sleep(0.01)"},{"line_number":64,"context_line":"                results.append(item)"},{"line_number":65,"context_line":"                pool.put(item)"},{"line_number":66,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"d72c6a76_b98d67d2","line":63,"in_reply_to":"233dc1b1_9f772332","updated":"2026-03-13 11:37:07.000000000","message":"Uhh, I think that was a leftover when I was testing with slow workers, and at that time not executing the real sleep when seconds\u003d0. Will be removed in next patchset.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":61,"context_line":"            try:"},{"line_number":62,"context_line":"                item \u003d pool.get()"},{"line_number":63,"context_line":"                sleep(0.01)"},{"line_number":64,"context_line":"                results.append(item)"},{"line_number":65,"context_line":"                pool.put(item)"},{"line_number":66,"context_line":"            except Exception as e:"},{"line_number":67,"context_line":"                errors.append(e)"}],"source_content_type":"text/x-python","patch_set":2,"id":"8ef50b30_e4eab63d","line":64,"updated":"2026-03-12 20:55:34.000000000","message":"Oh good, https://docs.python.org/3/library/threadsafety.html#thread-safety-for-list-objects calls out that `append` is atomic; I was worried for a sec that we should be using `queue` here.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":72,"context_line":"        for t in threads:"},{"line_number":73,"context_line":"            t.join(timeout\u003d5)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertEqual(len(errors), 0, errors)"},{"line_number":76,"context_line":"        self.assertEqual(len(results), 4)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_put_notifies_waiting_get(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"f9127971_f3adea99","line":75,"updated":"2026-03-12 20:55:34.000000000","message":"Alternatively, `self.assertFalse(errors)`","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1a808026a5171d7fedc6385339f60cce0d082dc5","unresolved":true,"context_lines":[{"line_number":72,"context_line":"        for t in threads:"},{"line_number":73,"context_line":"            t.join(timeout\u003d5)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertEqual(len(errors), 0, errors)"},{"line_number":76,"context_line":"        self.assertEqual(len(results), 4)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_put_notifies_waiting_get(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"63cc7d4b_5514b831","line":75,"in_reply_to":"f9127971_f3adea99","updated":"2026-03-13 11:37:07.000000000","message":"Ack","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":73,"context_line":"            t.join(timeout\u003d5)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        self.assertEqual(len(errors), 0, errors)"},{"line_number":76,"context_line":"        self.assertEqual(len(results), 4)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def test_put_notifies_waiting_get(self):"},{"line_number":79,"context_line":"        pool \u003d self._make_pool(max_size\u003d1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f27374e_48e4b338","line":76,"updated":"2026-03-12 20:55:34.000000000","message":"Better as `self.assertEqual(len(results), 4, results)`\n\nThough maybe it won\u0027t matter much in practice; if it\u0027s not 4, there should be some errors, so we would\u0027ve popped on the line above.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bb9ed7220c7b8cffd6a74f33e31dcaf44781be77","unresolved":true,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        t \u003d threading.Thread(target\u003dgetter)"},{"line_number":87,"context_line":"        t.start()"},{"line_number":88,"context_line":"        sleep(0.25)  # let getter block"},{"line_number":89,"context_line":"        pool.put(first)  # return item, unblock getter"},{"line_number":90,"context_line":"        t.join(timeout\u003d5)"},{"line_number":91,"context_line":"        self.assertEqual(result, [first])"}],"source_content_type":"text/x-python","patch_set":2,"id":"f3d71d8f_d7677ec5","line":88,"updated":"2026-03-12 20:55:34.000000000","message":"Better like\n```\ndiff --git a/test/unit/common/test_threadpool.py b/test/unit/common/test_threadpool.py\nindex 36b180643..309870741 100644\n--- a/test/unit/common/test_threadpool.py\n+++ b/test/unit/common/test_threadpool.py\n@@ -85,7 +85,9 @@ class TestThreadSafePool(unittest.TestCase):\n\n         t \u003d threading.Thread(target\u003dgetter)\n         t.start()\n-        sleep(0.25)  # let getter block\n+        t.join(timeout\u003d0.25)\n+        self.assertTrue(t.is_alive())\n+        self.assertEqual(result, [])\n         pool.put(first)  # return item, unblock getter\n         t.join(timeout\u003d5)\n         self.assertEqual(result, [first])\n```\nMaybe *even better* like\n```\ndiff --git a/test/unit/common/test_threadpool.py b/test/unit/common/test_threadpool.py\nindex 36b180643..009cb5413 100644\n--- a/test/unit/common/test_threadpool.py\n+++ b/test/unit/common/test_threadpool.py\n@@ -79,13 +79,17 @@ class TestThreadSafePool(unittest.TestCase):\n         pool \u003d self._make_pool(max_size\u003d1)\n         first \u003d pool.get()  # exhaust pool\n         result \u003d []\n+        e \u003d threading.Event()\n\n         def getter():\n+            e.set()\n             result.append(pool.get())\n\n         t \u003d threading.Thread(target\u003dgetter)\n         t.start()\n-        sleep(0.25)  # let getter block\n+        e.wait()\n+        self.assertTrue(t.is_alive())\n+        self.assertEqual(result, [])\n         pool.put(first)  # return item, unblock getter\n         t.join(timeout\u003d5)\n         self.assertEqual(result, [first])\n```","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1a808026a5171d7fedc6385339f60cce0d082dc5","unresolved":true,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        t \u003d threading.Thread(target\u003dgetter)"},{"line_number":87,"context_line":"        t.start()"},{"line_number":88,"context_line":"        sleep(0.25)  # let getter block"},{"line_number":89,"context_line":"        pool.put(first)  # return item, unblock getter"},{"line_number":90,"context_line":"        t.join(timeout\u003d5)"},{"line_number":91,"context_line":"        self.assertEqual(result, [first])"}],"source_content_type":"text/x-python","patch_set":2,"id":"04096102_71c0388c","line":88,"in_reply_to":"f3d71d8f_d7677ec5","updated":"2026-03-13 11:37:07.000000000","message":"Good idea, will include this in the next patchset.","commit_id":"26c8c297fd9d9621d0a8198691c7a9ef7524ce6d"}]}
