)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78a457bbcdbad292dae329a84eb4b2e66584ce66","unresolved":true,"context_lines":[{"line_number":12,"context_line":"Event.wait() before the line that cancels the timer, so a kill"},{"line_number":13,"context_line":"leaves the timer in place and Timer.called stays False. A test"},{"line_number":14,"context_line":"outside BaseUnitTestCase can also leave a timer that fails the next"},{"line_number":15,"context_line":"test, as test_PUT_with_slow_commits does."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"So tearDown kills the watchdog, reads Timer.pending, and compares"},{"line_number":18,"context_line":"against the timers present at setUp."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"d281631f_cc2ffbce","line":15,"updated":"2026-10-09 16:53:00.000000000","message":"Feels like a sign that it *should* have subclassed `BaseUnitTestCase` to me (which also means https://review.opendev.org/c/openstack/swift/+/1009622 should have fixed the base class...)","commit_id":"03456a4b696e6ae6068be4ff70be4c24515eead4"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78a457bbcdbad292dae329a84eb4b2e66584ce66","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"44758d18_56efe866","updated":"2026-10-09 16:53:00.000000000","message":"I\u0027m going to have a play at fixing `test_PUT_with_slow_commits` (and friends?)\n\nThis is definitely moving me more in the right direction, though, thanks!","commit_id":"03456a4b696e6ae6068be4ff70be4c24515eead4"}],"test/unit/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78a457bbcdbad292dae329a84eb4b2e66584ce66","unresolved":true,"context_lines":[{"line_number":78,"context_line":"        # a proxy app parks its watchdog in Event.wait(), which holds a timer"},{"line_number":79,"context_line":"        watchdog \u003d getattr(getattr(self, \u0027app\u0027, None), \u0027watchdog\u0027, None)"},{"line_number":80,"context_line":"        if isinstance(watchdog, utils.Watchdog):"},{"line_number":81,"context_line":"            watchdog.kill()"},{"line_number":82,"context_line":"        # give everything one last opportunity to fire"},{"line_number":83,"context_line":"        eventlet.sleep(0)"},{"line_number":84,"context_line":"        # Timer.pending, not Timer.called: killing a GreenThread leaves"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb7dc9f_fe12ea5b","line":81,"updated":"2026-10-09 16:53:00.000000000","message":"Clutch! I was trying to figure out what that `Event` was I was seeing -- `Watchdog` makes perfect sense. Good thing we\u0027re sensible enough to always call our apps-under-test `self.app`!","commit_id":"03456a4b696e6ae6068be4ff70be4c24515eead4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78a457bbcdbad292dae329a84eb4b2e66584ce66","unresolved":true,"context_lines":[{"line_number":81,"context_line":"            watchdog.kill()"},{"line_number":82,"context_line":"        # give everything one last opportunity to fire"},{"line_number":83,"context_line":"        eventlet.sleep(0)"},{"line_number":84,"context_line":"        # Timer.pending, not Timer.called: killing a GreenThread leaves"},{"line_number":85,"context_line":"        # Event.wait() before it cancels its own timer"},{"line_number":86,"context_line":"        lingering \u003d [t for _, t in hub.timers"},{"line_number":87,"context_line":"                     if t.pending and t not in self._timers_at_setup]"}],"source_content_type":"text/x-python","patch_set":1,"id":"a6cdf3fe_9543fb5f","line":84,"range":{"start_line":84,"start_character":10,"end_line":84,"end_character":41},"updated":"2026-10-09 16:53:00.000000000","message":"Aren\u0027t those equivalent? https://github.com/eventlet/eventlet/blob/0.41.2/eventlet/hubs/timer.py#L30-L32","commit_id":"03456a4b696e6ae6068be4ff70be4c24515eead4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2f831535dc8b872d3067cd5d82b16123dff6b8ab","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            watchdog.kill()"},{"line_number":82,"context_line":"        # give everything one last opportunity to fire"},{"line_number":83,"context_line":"        eventlet.sleep(0)"},{"line_number":84,"context_line":"        # Timer.pending, not Timer.called: killing a GreenThread leaves"},{"line_number":85,"context_line":"        # Event.wait() before it cancels its own timer"},{"line_number":86,"context_line":"        lingering \u003d [t for _, t in hub.timers"},{"line_number":87,"context_line":"                     if t.pending and t not in self._timers_at_setup]"}],"source_content_type":"text/x-python","patch_set":1,"id":"12caec1e_c9d1324f","line":84,"range":{"start_line":84,"start_character":10,"end_line":84,"end_character":41},"in_reply_to":"a6cdf3fe_9543fb5f","updated":"2026-10-09 16:59:28.000000000","message":"Oh, right! `LocalTimer` needs to check that the greenlet\u0027s still alive: https://github.com/eventlet/eventlet/blob/0.41.2/eventlet/hubs/timer.py#L90-L94","commit_id":"03456a4b696e6ae6068be4ff70be4c24515eead4"}]}
