)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cf2072c34f2eaa0eb5b0e5795b03d84514eedfdf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"61eda3b1_514bc34b","updated":"2023-04-26 17:58:06.000000000","message":"tests are passing; it does what it says.\n\nit\u0027s kind of a dumb implementation, but it\u0027s not obvious how much to invest to make it more obvious.","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8d5923c3_ec8c1d4c","updated":"2023-04-27 15:09:15.000000000","message":"i dig it!","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9fd5e5bc2f9f19442af462911bbb55fa625e54d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"90de6068_c240aff4","updated":"2023-04-26 21:48:22.000000000","message":"i\u0027ve seen log lines like this in dev\n\nApr 25 22:03:34 saio proxy-server: ChunkReadTimeout fetching fragments for \u0027/AUTH_test/ectest/test.big\u0027: ChunkReadTimeout (3.0s after 3.02s) (txn: tx3d71b381453b4fc292288-0064484e30) (client_ip: 127.0.0.1)","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3b906dc2f248c8e89a98faa05e62be95f1e9ac4f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a6fe759b_006320ab","updated":"2023-04-27 10:03:54.000000000","message":"idea for another test here: https://review.opendev.org/c/openstack/swift/+/881709 (for squash)","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d43d20a0fa5b156dc5f522f54c6d0871524d1ba2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1c1bc1b5_5f56f81f","updated":"2023-05-01 00:12:04.000000000","message":"Looks good. Gives us more data when we do have a created_at defined.","commit_id":"8d23dd8ac657aa727cd01ccb739a54511a307c29"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2dcc35e1f5a62b013ff9281451180db80e287735","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"011b6c2e_01e8f830","updated":"2023-04-28 22:38:26.000000000","message":"Looks reasonable.","commit_id":"8d23dd8ac657aa727cd01ccb739a54511a307c29"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f134cb31f47903a5a0fb1a5d66603e304572d349","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"14f32282_631c6e6b","updated":"2023-05-01 04:09:53.000000000","message":"recheck","commit_id":"8d23dd8ac657aa727cd01ccb739a54511a307c29"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"353edf8a36457dd7cc0c354b618f5128f690974f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"809146b1_25f6d839","updated":"2023-05-01 01:21:18.000000000","message":"recheck","commit_id":"8d23dd8ac657aa727cd01ccb739a54511a307c29"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ac068fe42b32205cab7001b48eb7719fe2c98efd","unresolved":true,"context_lines":[{"line_number":1611,"context_line":"            emsg \u003d \u0027%s: %s\u0027 % (exc.__class__.__name__, exc.line)"},{"line_number":1612,"context_line":"        elif isinstance(exc, eventlet.Timeout):"},{"line_number":1613,"context_line":"            emsg \u003d exc.__class__.__name__"},{"line_number":1614,"context_line":"            if hasattr(exc, \u0027seconds\u0027):"},{"line_number":1615,"context_line":"                detail \u003d \u0027%ss\u0027 % exc.seconds"},{"line_number":1616,"context_line":"                if hasattr(exc, \u0027created_at\u0027):"},{"line_number":1617,"context_line":"                    detail +\u003d \u0027 after %0.2fs\u0027 % (time.time() - exc.created_at)"}],"source_content_type":"text/x-python","patch_set":2,"id":"494c73a9_67eb2194","line":1614,"range":{"start_line":1614,"start_character":15,"end_line":1614,"end_character":38},"updated":"2023-04-26 18:20:08.000000000","message":"can an instance of eventlet.Timeout not have seconds? The base class has it (but it can be None) so can any subclass not have it?","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3b906dc2f248c8e89a98faa05e62be95f1e9ac4f","unresolved":false,"context_lines":[{"line_number":1611,"context_line":"            emsg \u003d \u0027%s: %s\u0027 % (exc.__class__.__name__, exc.line)"},{"line_number":1612,"context_line":"        elif isinstance(exc, eventlet.Timeout):"},{"line_number":1613,"context_line":"            emsg \u003d exc.__class__.__name__"},{"line_number":1614,"context_line":"            if hasattr(exc, \u0027seconds\u0027):"},{"line_number":1615,"context_line":"                detail \u003d \u0027%ss\u0027 % exc.seconds"},{"line_number":1616,"context_line":"                if hasattr(exc, \u0027created_at\u0027):"},{"line_number":1617,"context_line":"                    detail +\u003d \u0027 after %0.2fs\u0027 % (time.time() - exc.created_at)"}],"source_content_type":"text/x-python","patch_set":2,"id":"348e0997_60375d5a","line":1614,"range":{"start_line":1614,"start_character":15,"end_line":1614,"end_character":38},"in_reply_to":"494c73a9_67eb2194","updated":"2023-04-27 10:03:54.000000000","message":"Done","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cf2072c34f2eaa0eb5b0e5795b03d84514eedfdf","unresolved":true,"context_lines":[{"line_number":1613,"context_line":"            emsg \u003d exc.__class__.__name__"},{"line_number":1614,"context_line":"            if hasattr(exc, \u0027seconds\u0027):"},{"line_number":1615,"context_line":"                detail \u003d \u0027%ss\u0027 % exc.seconds"},{"line_number":1616,"context_line":"                if hasattr(exc, \u0027created_at\u0027):"},{"line_number":1617,"context_line":"                    detail +\u003d \u0027 after %0.2fs\u0027 % (time.time() - exc.created_at)"},{"line_number":1618,"context_line":"                emsg +\u003d \u0027 (%s)\u0027 % detail"},{"line_number":1619,"context_line":"            if isinstance(exc, swift.common.exceptions.MessageTimeout):"}],"source_content_type":"text/x-python","patch_set":2,"id":"faedfee5_d852d9b5","line":1616,"updated":"2023-04-26 17:58:06.000000000","message":"this is kind of dumb, but existing somewhat obviously existing dumbness.  Who sets \u0027seconds\u0027 who sets \u0027created_at\u0027?  Who knows!?","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":false,"context_lines":[{"line_number":1613,"context_line":"            emsg \u003d exc.__class__.__name__"},{"line_number":1614,"context_line":"            if hasattr(exc, \u0027seconds\u0027):"},{"line_number":1615,"context_line":"                detail \u003d \u0027%ss\u0027 % exc.seconds"},{"line_number":1616,"context_line":"                if hasattr(exc, \u0027created_at\u0027):"},{"line_number":1617,"context_line":"                    detail +\u003d \u0027 after %0.2fs\u0027 % (time.time() - exc.created_at)"},{"line_number":1618,"context_line":"                emsg +\u003d \u0027 (%s)\u0027 % detail"},{"line_number":1619,"context_line":"            if isinstance(exc, swift.common.exceptions.MessageTimeout):"}],"source_content_type":"text/x-python","patch_set":2,"id":"979c25a5_5dc401fc","line":1616,"in_reply_to":"faedfee5_d852d9b5","updated":"2023-04-27 15:09:15.000000000","message":"Done","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cf2072c34f2eaa0eb5b0e5795b03d84514eedfdf","unresolved":true,"context_lines":[{"line_number":1615,"context_line":"                detail \u003d \u0027%ss\u0027 % exc.seconds"},{"line_number":1616,"context_line":"                if hasattr(exc, \u0027created_at\u0027):"},{"line_number":1617,"context_line":"                    detail +\u003d \u0027 after %0.2fs\u0027 % (time.time() - exc.created_at)"},{"line_number":1618,"context_line":"                emsg +\u003d \u0027 (%s)\u0027 % detail"},{"line_number":1619,"context_line":"            if isinstance(exc, swift.common.exceptions.MessageTimeout):"},{"line_number":1620,"context_line":"                if exc.msg:"},{"line_number":1621,"context_line":"                    emsg +\u003d \u0027 %s\u0027 % exc.msg"}],"source_content_type":"text/x-python","patch_set":2,"id":"a0e9b8ff_72ef53ef","line":1618,"updated":"2023-04-26 17:58:06.000000000","message":"... but if they\u0027re here this is what we do with them, and that obvious and useful","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":false,"context_lines":[{"line_number":1615,"context_line":"                detail \u003d \u0027%ss\u0027 % exc.seconds"},{"line_number":1616,"context_line":"                if hasattr(exc, \u0027created_at\u0027):"},{"line_number":1617,"context_line":"                    detail +\u003d \u0027 after %0.2fs\u0027 % (time.time() - exc.created_at)"},{"line_number":1618,"context_line":"                emsg +\u003d \u0027 (%s)\u0027 % detail"},{"line_number":1619,"context_line":"            if isinstance(exc, swift.common.exceptions.MessageTimeout):"},{"line_number":1620,"context_line":"                if exc.msg:"},{"line_number":1621,"context_line":"                    emsg +\u003d \u0027 %s\u0027 % exc.msg"}],"source_content_type":"text/x-python","patch_set":2,"id":"79dd9788_5c1a3f97","line":1618,"in_reply_to":"a0e9b8ff_72ef53ef","updated":"2023-04-27 15:09:15.000000000","message":"Done","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ac068fe42b32205cab7001b48eb7719fe2c98efd","unresolved":true,"context_lines":[{"line_number":6186,"context_line":"        if not timeout_at:"},{"line_number":6187,"context_line":"            timeout_at \u003d time.time() + timeout"},{"line_number":6188,"context_line":"        gth \u003d eventlet.greenthread.getcurrent()"},{"line_number":6189,"context_line":"        timeout_definition \u003d (timeout, timeout_at, gth, exc, time.time())"},{"line_number":6190,"context_line":"        key \u003d id(timeout_definition)"},{"line_number":6191,"context_line":"        self._timeouts[key] \u003d timeout_definition"},{"line_number":6192,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"84727a8b_1b5386eb","line":6189,"range":{"start_line":6189,"start_character":61,"end_line":6189,"end_character":72},"updated":"2023-04-26 18:20:08.000000000","message":"nit: could declare created_at at line 6186 and then use it here and to calculate timeout_at","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3b906dc2f248c8e89a98faa05e62be95f1e9ac4f","unresolved":false,"context_lines":[{"line_number":6186,"context_line":"        if not timeout_at:"},{"line_number":6187,"context_line":"            timeout_at \u003d time.time() + timeout"},{"line_number":6188,"context_line":"        gth \u003d eventlet.greenthread.getcurrent()"},{"line_number":6189,"context_line":"        timeout_definition \u003d (timeout, timeout_at, gth, exc, time.time())"},{"line_number":6190,"context_line":"        key \u003d id(timeout_definition)"},{"line_number":6191,"context_line":"        self._timeouts[key] \u003d timeout_definition"},{"line_number":6192,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a618593_052edcf3","line":6189,"range":{"start_line":6189,"start_character":61,"end_line":6189,"end_character":72},"in_reply_to":"3a329cb1_591e0e86","updated":"2023-04-27 10:03:54.000000000","message":"Done","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"dab9d9356e4db60924384e2ade7225d07b56ddee","unresolved":true,"context_lines":[{"line_number":6186,"context_line":"        if not timeout_at:"},{"line_number":6187,"context_line":"            timeout_at \u003d time.time() + timeout"},{"line_number":6188,"context_line":"        gth \u003d eventlet.greenthread.getcurrent()"},{"line_number":6189,"context_line":"        timeout_definition \u003d (timeout, timeout_at, gth, exc, time.time())"},{"line_number":6190,"context_line":"        key \u003d id(timeout_definition)"},{"line_number":6191,"context_line":"        self._timeouts[key] \u003d timeout_definition"},{"line_number":6192,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a329cb1_591e0e86","line":6189,"range":{"start_line":6189,"start_character":61,"end_line":6189,"end_character":72},"in_reply_to":"84727a8b_1b5386eb","updated":"2023-04-26 18:42:47.000000000","message":"oh, yeah - i like that better.","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cf2072c34f2eaa0eb5b0e5795b03d84514eedfdf","unresolved":true,"context_lines":[{"line_number":6240,"context_line":"                    pass"},{"line_number":6241,"context_line":"                e \u003d exc()"},{"line_number":6242,"context_line":"                e.seconds \u003d timeout"},{"line_number":6243,"context_line":"                e.created_at \u003d created_at"},{"line_number":6244,"context_line":"                eventlet.hubs.get_hub().schedule_call_global(0, gth.throw, e)"},{"line_number":6245,"context_line":"            else:"},{"line_number":6246,"context_line":"                if (self._next_expiration is None"}],"source_content_type":"text/x-python","patch_set":2,"id":"a1931885_ea3a179a","line":6243,"updated":"2023-04-26 17:58:06.000000000","message":"my first attempt was some sort of class hierarchy but then discovered we don\u0027t create the timeouts until we\u0027re about to raise them.  Maybe that could be refactored somehow.","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":false,"context_lines":[{"line_number":6240,"context_line":"                    pass"},{"line_number":6241,"context_line":"                e \u003d exc()"},{"line_number":6242,"context_line":"                e.seconds \u003d timeout"},{"line_number":6243,"context_line":"                e.created_at \u003d created_at"},{"line_number":6244,"context_line":"                eventlet.hubs.get_hub().schedule_call_global(0, gth.throw, e)"},{"line_number":6245,"context_line":"            else:"},{"line_number":6246,"context_line":"                if (self._next_expiration is None"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a37d9f8_6d29e1e4","line":6243,"in_reply_to":"a1931885_ea3a179a","updated":"2023-04-27 15:09:15.000000000","message":"Done","commit_id":"c4e218168b25aa578a761505ded1fad0baf3cce9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3b906dc2f248c8e89a98faa05e62be95f1e9ac4f","unresolved":true,"context_lines":[{"line_number":6178,"context_line":""},{"line_number":6179,"context_line":"        :param timeout: duration before the timeout expires"},{"line_number":6180,"context_line":"        :param exc: exception to throw when the timeout expire, must inherit"},{"line_number":6181,"context_line":"                    from eventlet.timeouts.Timeout"},{"line_number":6182,"context_line":"        :param timeout_at: allow to force the expiration timestamp"},{"line_number":6183,"context_line":"        :return: id of the scheduled timeout, needed to cancel it"},{"line_number":6184,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"17700415_a4c616e6","line":6181,"range":{"start_line":6181,"start_character":25,"end_line":6181,"end_character":50},"updated":"2023-04-27 10:03:54.000000000","message":"nit: should be either eventlet.timeout.Timeout or just eventlet.Timeout\n\nNothing checks that exc is a subclass of eventlet.Timeout. I\u0027m not sure what would happen if it wasn\u0027t.","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":false,"context_lines":[{"line_number":6178,"context_line":""},{"line_number":6179,"context_line":"        :param timeout: duration before the timeout expires"},{"line_number":6180,"context_line":"        :param exc: exception to throw when the timeout expire, must inherit"},{"line_number":6181,"context_line":"                    from eventlet.timeouts.Timeout"},{"line_number":6182,"context_line":"        :param timeout_at: allow to force the expiration timestamp"},{"line_number":6183,"context_line":"        :return: id of the scheduled timeout, needed to cancel it"},{"line_number":6184,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f242591_315c066b","line":6181,"range":{"start_line":6181,"start_character":25,"end_line":6181,"end_character":50},"in_reply_to":"17700415_a4c616e6","updated":"2023-04-27 15:09:15.000000000","message":"Done","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3b906dc2f248c8e89a98faa05e62be95f1e9ac4f","unresolved":true,"context_lines":[{"line_number":6234,"context_line":"                created_at) in list(self._timeouts.items()):"},{"line_number":6235,"context_line":"            if timeout_at \u003c\u003d now:"},{"line_number":6236,"context_line":"                try:"},{"line_number":6237,"context_line":"                    if k in self._timeouts:"},{"line_number":6238,"context_line":"                        del(self._timeouts[k])"},{"line_number":6239,"context_line":"                except KeyError:"},{"line_number":6240,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"c2ace82f_c6679230","line":6237,"updated":"2023-04-27 10:03:54.000000000","message":"I\u0027m not sure I understand how k would not be in self._timeouts unless this loop yielded and another thread called stop(), but I don\u0027t see anywhere that would happen 😕","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":true,"context_lines":[{"line_number":6234,"context_line":"                created_at) in list(self._timeouts.items()):"},{"line_number":6235,"context_line":"            if timeout_at \u003c\u003d now:"},{"line_number":6236,"context_line":"                try:"},{"line_number":6237,"context_line":"                    if k in self._timeouts:"},{"line_number":6238,"context_line":"                        del(self._timeouts[k])"},{"line_number":6239,"context_line":"                except KeyError:"},{"line_number":6240,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"f3157b45_652e3595","line":6237,"in_reply_to":"c2ace82f_c6679230","updated":"2023-04-27 15:09:15.000000000","message":"and also dumb; we\u0027re doing the `if k in` *and* catching KeyError","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3b906dc2f248c8e89a98faa05e62be95f1e9ac4f","unresolved":true,"context_lines":[{"line_number":6239,"context_line":"                except KeyError:"},{"line_number":6240,"context_line":"                    pass"},{"line_number":6241,"context_line":"                e \u003d exc()"},{"line_number":6242,"context_line":"                e.seconds \u003d timeout"},{"line_number":6243,"context_line":"                e.created_at \u003d created_at"},{"line_number":6244,"context_line":"                eventlet.hubs.get_hub().schedule_call_global(0, gth.throw, e)"},{"line_number":6245,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"58ace0c6_b6aa6883","line":6242,"updated":"2023-04-27 10:03:54.000000000","message":"ok, I guess this is safer just in case exc is not a subclass of eventlet.Timeout, otherwise\n```\n e \u003d exc(timeout)\n ```","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d43d20a0fa5b156dc5f522f54c6d0871524d1ba2","unresolved":true,"context_lines":[{"line_number":6239,"context_line":"                except KeyError:"},{"line_number":6240,"context_line":"                    pass"},{"line_number":6241,"context_line":"                e \u003d exc()"},{"line_number":6242,"context_line":"                e.seconds \u003d timeout"},{"line_number":6243,"context_line":"                e.created_at \u003d created_at"},{"line_number":6244,"context_line":"                eventlet.hubs.get_hub().schedule_call_global(0, gth.throw, e)"},{"line_number":6245,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9bcf3ddd_e780428a","line":6242,"in_reply_to":"3f40e4b5_b12b7e9f","updated":"2023-05-01 00:12:04.000000000","message":"yeah, I did the same look in both py2 and py3 and there is no created_at attribute in timeout. But we use a hasattr for it, so ok to add it as it will give us this extra bit of logging.","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":true,"context_lines":[{"line_number":6239,"context_line":"                except KeyError:"},{"line_number":6240,"context_line":"                    pass"},{"line_number":6241,"context_line":"                e \u003d exc()"},{"line_number":6242,"context_line":"                e.seconds \u003d timeout"},{"line_number":6243,"context_line":"                e.created_at \u003d created_at"},{"line_number":6244,"context_line":"                eventlet.hubs.get_hub().schedule_call_global(0, gth.throw, e)"},{"line_number":6245,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"8326397b_28112040","line":6242,"in_reply_to":"58ace0c6_b6aa6883","updated":"2023-04-27 15:09:15.000000000","message":"yeah, probably should fix in order to make it slightly more obvious that passing the undocumented created_at attribute to the logger is gross.","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2dcc35e1f5a62b013ff9281451180db80e287735","unresolved":true,"context_lines":[{"line_number":6239,"context_line":"                except KeyError:"},{"line_number":6240,"context_line":"                    pass"},{"line_number":6241,"context_line":"                e \u003d exc()"},{"line_number":6242,"context_line":"                e.seconds \u003d timeout"},{"line_number":6243,"context_line":"                e.created_at \u003d created_at"},{"line_number":6244,"context_line":"                eventlet.hubs.get_hub().schedule_call_global(0, gth.throw, e)"},{"line_number":6245,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f40e4b5_b12b7e9f","line":6242,"in_reply_to":"8326397b_28112040","updated":"2023-04-28 22:38:26.000000000","message":"\u003e the undocumented created_at attribute\n\nNot so much undocumented; more something that we invented, right? I don\u0027t see `created_at` in https://github.com/eventlet/eventlet/blob/master/eventlet/timeout.py at all.","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":true,"context_lines":[{"line_number":6241,"context_line":"                e \u003d exc()"},{"line_number":6242,"context_line":"                e.seconds \u003d timeout"},{"line_number":6243,"context_line":"                e.created_at \u003d created_at"},{"line_number":6244,"context_line":"                eventlet.hubs.get_hub().schedule_call_global(0, gth.throw, e)"},{"line_number":6245,"context_line":"            else:"},{"line_number":6246,"context_line":"                if (self._next_expiration is None"},{"line_number":6247,"context_line":"                        or self._next_expiration \u003e timeout_at):"}],"source_content_type":"text/x-python","patch_set":3,"id":"616472bb_475d3dc5","line":6244,"updated":"2023-04-27 15:09:15.000000000","message":"I don\u0027t think this is a documented public eventlet hub interface:\n\nhttps://eventlet.net/doc/hubs.html\n\n... but reading the code it doesn\u0027t seem like it can yield.","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d43d20a0fa5b156dc5f522f54c6d0871524d1ba2","unresolved":false,"context_lines":[{"line_number":1611,"context_line":"            emsg \u003d \u0027%s: %s\u0027 % (exc.__class__.__name__, exc.line)"},{"line_number":1612,"context_line":"        elif isinstance(exc, eventlet.Timeout):"},{"line_number":1613,"context_line":"            emsg \u003d exc.__class__.__name__"},{"line_number":1614,"context_line":"            detail \u003d \u0027%ss\u0027 % exc.seconds"},{"line_number":1615,"context_line":"            if hasattr(exc, \u0027created_at\u0027):"},{"line_number":1616,"context_line":"                detail +\u003d \u0027 after %0.2fs\u0027 % (time.time() - exc.created_at)"},{"line_number":1617,"context_line":"            emsg +\u003d \u0027 (%s)\u0027 % detail"}],"source_content_type":"text/x-python","patch_set":6,"id":"2704f41f_f5c1f3f9","line":1614,"range":{"start_line":1614,"start_character":29,"end_line":1614,"end_character":40},"updated":"2023-05-01 00:12:04.000000000","message":"OK, yup I can confirm Timeout has seconds attribute. So we haven\u0027t lost anything with the removal of the hasattr.","commit_id":"8d23dd8ac657aa727cd01ccb739a54511a307c29"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3b906dc2f248c8e89a98faa05e62be95f1e9ac4f","unresolved":true,"context_lines":[{"line_number":4926,"context_line":"        for line in error_lines[:nparity]:"},{"line_number":4927,"context_line":"            self.assertIn(\u0027retrying\u0027, line)"},{"line_number":4928,"context_line":"        for line in error_lines[nparity:]:"},{"line_number":4929,"context_line":"            self.assertIn(\u0027ChunkReadTimeout\u0027, line)"},{"line_number":4930,"context_line":"        for line in self.logger.logger.records[\u0027ERROR\u0027]:"},{"line_number":4931,"context_line":"            self.assertIn(req.headers[\u0027x-trans-id\u0027], line)"},{"line_number":4932,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9599cc3e_03939a0f","line":4929,"updated":"2023-04-27 10:03:54.000000000","message":"could still assert \"ChunkReadTimeout (0.01s\"","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fe5c68ce8e517a9934bd7e56e95c963838533e3","unresolved":false,"context_lines":[{"line_number":4926,"context_line":"        for line in error_lines[:nparity]:"},{"line_number":4927,"context_line":"            self.assertIn(\u0027retrying\u0027, line)"},{"line_number":4928,"context_line":"        for line in error_lines[nparity:]:"},{"line_number":4929,"context_line":"            self.assertIn(\u0027ChunkReadTimeout\u0027, line)"},{"line_number":4930,"context_line":"        for line in self.logger.logger.records[\u0027ERROR\u0027]:"},{"line_number":4931,"context_line":"            self.assertIn(req.headers[\u0027x-trans-id\u0027], line)"},{"line_number":4932,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"58c98d73_d026d282","line":4929,"in_reply_to":"9599cc3e_03939a0f","updated":"2023-04-27 15:09:15.000000000","message":"Ack","commit_id":"a596cb162c43d91269c8c733aae0aa91eddc8a72"}]}
