)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"734a4124cf65af5ee8ffeb67b61e97486cb57aa0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6958973d_e1df66d5","updated":"2026-03-12 02:01:23.000000000","message":"Seems pretty straight-forward. I\u0027m realizing that we may want to write some migration docs (targeting out-of-tree developers), too...","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"8bbd096f971774485ef78a6498ab25ba7337deeb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8a054530_740459ec","updated":"2026-03-09 16:11:22.000000000","message":"recheck","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"02b3cf76e86b5cc24c1abed558f236d97b1278c9","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ca401268_542e879d","in_reply_to":"28e8cb5c_88384dce","updated":"2026-03-13 15:38:49.000000000","message":"I was thinking a doc file in repo.","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1294f3236530a7711cb2b8f7ad40ed301d42015c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"28e8cb5c_88384dce","in_reply_to":"6958973d_e1df66d5","updated":"2026-03-13 11:25:28.000000000","message":"Indeed! I\u0027m wondering if we should add a \"DocImpact\", \"UpgradeImpact\", \"EventletMigrationImpact\" or sth similar to commit messages that need them? To keep track of them? Or shall we start directly with a doc file in the repo and add successively these notes?","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"300711171964f29fa7ab83f8844a229d267f15e8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"cbfd9d58_267441f3","in_reply_to":"ca401268_542e879d","updated":"2026-06-25 14:23:31.000000000","message":"Question: Should migration documentation be included in this patch, or is it acceptable as follow-up work? If included, it could also document the semantic change for `sleep(0)` yields in eventlet, becomes no-op in threading mode","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"300711171964f29fa7ab83f8844a229d267f15e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8239999d_247f7f97","updated":"2026-06-25 14:23:31.000000000","message":"This looks good to me. I dropped a few comments and also I would suggest adding in the commit message about the semantic change for sleep(0)\n\n\u003e In threading mode, sleep(0) becomes a no-op since the OS scheduler handles preemptive multitasking, unlike eventlet which requires explicit yields for cooperative multitasking. This is the intended behavior - real threads do not require manual yielding.\n\nBut it\u0027s all up to you","commit_id":"f394d21a957c0feeea7110670d7633279c4b5e30"}],"swift/common/concurrency.py":[{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"300711171964f29fa7ab83f8844a229d267f15e8","unresolved":true,"context_lines":[{"line_number":94,"context_line":"            # Only needed without eventlet"},{"line_number":95,"context_line":"            pass"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    from eventlet import sleep"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"else:"},{"line_number":100,"context_line":"    class Timeout(BaseException):"}],"source_content_type":"text/x-python","patch_set":10,"id":"b4f9b6b9_b75a589d","line":97,"updated":"2026-06-25 14:23:31.000000000","message":"Suggestion: Consider adding a simple test in `test/unit/common/test_concurrency.py` for documenting the expected behaviour\n\n```\n  def test_sleep_zero_no_exception(self):\n      \"\"\"Verify sleep(0) and sleep() don\u0027t raise exceptions\"\"\"\n      from swift.common.concurrency import sleep\n      sleep(0)    # Should not raise\n      sleep()     # Should not raise\n      sleep(0.001)  # Should actually sleep\n\n```","commit_id":"f394d21a957c0feeea7110670d7633279c4b5e30"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"734a4124cf65af5ee8ffeb67b61e97486cb57aa0","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    from eventlet import sleep"},{"line_number":54,"context_line":"else:"},{"line_number":55,"context_line":"    def sleep(seconds\u003d0):"},{"line_number":56,"context_line":"        time.sleep(seconds)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"import eventlet"},{"line_number":59,"context_line":"import eventlet.debug"}],"source_content_type":"text/x-python","patch_set":2,"id":"53fc03b3_55a7c8c0","line":56,"updated":"2026-03-12 02:01:23.000000000","message":"Makes me wonder how many places we\u0027ve throw in a\n```\nsleep()  # give other greenthreads a chance\n```\nover the years...\n\nAlso makes me wonder if we might want to say\n```\nif seconds:\n    time.sleep(seconds)\n```\nApparently, `sleep(0)` costs more than the check (though it\u0027s all sub-microsecond)\n```\n% python -m timeit -s \u0027import time\u0027 \u0027time.sleep(0)\u0027\n2000000 loops, best of 5: 156 nsec per loop\n% python -m timeit -s \u0027import time\u0027 \u0027if False: time.sleep(0)\u0027\n100000000 loops, best of 5: 2.51 nsec per loop\n```","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"1294f3236530a7711cb2b8f7ad40ed301d42015c","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    from eventlet import sleep"},{"line_number":54,"context_line":"else:"},{"line_number":55,"context_line":"    def sleep(seconds\u003d0):"},{"line_number":56,"context_line":"        time.sleep(seconds)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"import eventlet"},{"line_number":59,"context_line":"import eventlet.debug"}],"source_content_type":"text/x-python","patch_set":2,"id":"9c45be14_1c9d8b32","line":56,"in_reply_to":"53fc03b3_55a7c8c0","updated":"2026-03-13 11:25:28.000000000","message":"Was thinking of this as well. Will include this in the next patchset.","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"baae9282fb57e37ce4da71dda374f294f5c5f238","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    from eventlet import sleep"},{"line_number":54,"context_line":"else:"},{"line_number":55,"context_line":"    def sleep(seconds\u003d0):"},{"line_number":56,"context_line":"        time.sleep(seconds)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"import eventlet"},{"line_number":59,"context_line":"import eventlet.debug"}],"source_content_type":"text/x-python","patch_set":2,"id":"ea0c0793_2c52b552","line":56,"in_reply_to":"9c45be14_1c9d8b32","updated":"2026-03-13 16:52:56.000000000","message":"Done","commit_id":"32a3dbb3a7dd4b4c0d3f60b4b46fe652e62f6381"}],"test/unit/container/test_reconciler.py":[{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy"},"change_message_id":"300711171964f29fa7ab83f8844a229d267f15e8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e143ab0d_29dbc81c","updated":"2026-06-25 14:23:31.000000000","message":"Question: I see some tests relying on sleep(0), do we plan on leaving them like this?\n```\nvagrant@saio:~/swift$ git grep -n \"sleep(0)\" swift/ test/\ntest/unit/common/test_utils.py:4912:            sleep(0)\ntest/unit/common/test_utils.py:4927:            sleep(0)\ntest/unit/common/utils/test_logs.py:1306:            eventlet.sleep(0)  # let coro2 go\ntest/unit/obj/test_diskfile.py:7791:        sleep(0)  # make sure thread starts\ntest/unit/obj/test_server.py:10041:            sleep(0)\ntest/unit/obj/test_server.py:10150:        sleep(0)\ntest/unit/obj/test_server.py:10191:        sleep(0)\ntest/unit/obj/test_server.py:10367:        sleep(0)\ntest/unit/obj/test_ssync_receiver.py:2603:        eventlet.sleep(0)\ntest/unit/obj/test_ssync_receiver.py:2632:                eventlet.sleep(0)\ntest/unit/proxy/test_server.py:7030:                sleep(0)  # let eventlet do its thing\ntest/unit/proxy/test_server.py:7033:                sleep(0)\ntest/unit/proxy/test_server.py:7052:                sleep(0)  # let eventlet do its thing\ntest/unit/proxy/test_server.py:7055:                sleep(0)\n```","commit_id":"f394d21a957c0feeea7110670d7633279c4b5e30"}]}
