)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"dde81a34_7cc7dcd3","updated":"2023-12-05 20:06:14.000000000","message":"oops, I was going to +A this but I started at the wrong end of a chain\n\nfeel free to squash:\n\nhttps://review.opendev.org/c/openstack/swift/+/902724\n\n... if it\u0027s useful.\n\nI\u0027ll go back to the begining and try and merge those.","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"645a22fa_21f56eb0","updated":"2024-01-25 14:22:01.000000000","message":"Squashed in Clay\u0027s follow-up and rebased this onto master to get it merged, based on Clay\u0027s +2. Small steps forward.","commit_id":"a16e1f55a742f33bdfda55d38d6962a785fe5c97"}],"test/unit/proxy/controllers/test_base.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":1690,"context_line":"        self.assertEqual(2, getter.node_timeout)"},{"line_number":1691,"context_line":"        getter \u003d GetOrHeadHandler("},{"line_number":1692,"context_line":"            app, req, \u0027Container\u0027, node_iter, None, None, {})"},{"line_number":1693,"context_line":"        self.assertEqual(2, getter.node_timeout)"},{"line_number":1694,"context_line":""},{"line_number":1695,"context_line":"    def test_disconnected_logging(self):"},{"line_number":1696,"context_line":"        self.app.logger \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":4,"id":"d4469159_2399f8b9","line":1693,"updated":"2023-12-05 20:06:14.000000000","message":"\"stringly\" typed\n\nhttps://github.com/NVIDIA/swift/blob/master/swift/proxy/controllers/base.py#L1325-L1328\n\nnothing wrong with adding a test to call it out IMHO","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":1690,"context_line":"        self.assertEqual(2, getter.node_timeout)"},{"line_number":1691,"context_line":"        getter \u003d GetOrHeadHandler("},{"line_number":1692,"context_line":"            app, req, \u0027Container\u0027, node_iter, None, None, {})"},{"line_number":1693,"context_line":"        self.assertEqual(2, getter.node_timeout)"},{"line_number":1694,"context_line":""},{"line_number":1695,"context_line":"    def test_disconnected_logging(self):"},{"line_number":1696,"context_line":"        self.app.logger \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":4,"id":"d1895a07_8ffc8fa7","line":1693,"in_reply_to":"d4469159_2399f8b9","updated":"2024-01-25 14:22:01.000000000","message":"yep, that could be improved!","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a3fed703bf02705e885170049996018f22a45b9e","unresolved":true,"context_lines":[{"line_number":1839,"context_line":"        for line in error_lines[:3]:"},{"line_number":1840,"context_line":"            self.assertIn(\u0027Trying to read object during GET\u0027, line)"},{"line_number":1841,"context_line":""},{"line_number":1842,"context_line":"    def test_GET_newest_will_not_resume(self):"},{"line_number":1843,"context_line":"        self.app.recoverable_node_timeout \u003d 0.01"},{"line_number":1844,"context_line":"        self.app.client_timeout \u003d 0.1"},{"line_number":1845,"context_line":"        self.app.object_chunk_size \u003d 10"}],"source_content_type":"text/x-python","patch_set":1,"id":"29874454_ec7f15bb","line":1842,"updated":"2023-11-02 18:49:05.000000000","message":"I\u0027m not sure why x-newest GETs do not resume, but the code makes it very explicit, so it\u0027s not obvious to me that this is asserting a bug. I\u0027d like to understand the reason though.","commit_id":"2059b1a90fe1f06a7c1844561bbeaff95c4bc865"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":1839,"context_line":"        for line in error_lines[:3]:"},{"line_number":1840,"context_line":"            self.assertIn(\u0027Trying to read object during GET\u0027, line)"},{"line_number":1841,"context_line":""},{"line_number":1842,"context_line":"    def test_GET_newest_will_not_resume(self):"},{"line_number":1843,"context_line":"        self.app.recoverable_node_timeout \u003d 0.01"},{"line_number":1844,"context_line":"        self.app.client_timeout \u003d 0.1"},{"line_number":1845,"context_line":"        self.app.object_chunk_size \u003d 10"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc2936e_03defd20","line":1842,"in_reply_to":"29874454_ec7f15bb","updated":"2023-12-05 20:06:14.000000000","message":"I\u0027m sure it was just lazy-ness when adding resuming - didn\u0027t want to have to track x-timestamp/etag and possibly disregard the refetched/retries since we\u0027d already contacted all nodes trying to get the x-newest.  I\u0027m sure adding the test to describe the current behavior explicitly is better than not having the test - KUDOS.","commit_id":"2059b1a90fe1f06a7c1844561bbeaff95c4bc865"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":1839,"context_line":"        for line in error_lines[:3]:"},{"line_number":1840,"context_line":"            self.assertIn(\u0027Trying to read object during GET\u0027, line)"},{"line_number":1841,"context_line":""},{"line_number":1842,"context_line":"    def test_GET_newest_will_not_resume(self):"},{"line_number":1843,"context_line":"        self.app.recoverable_node_timeout \u003d 0.01"},{"line_number":1844,"context_line":"        self.app.client_timeout \u003d 0.1"},{"line_number":1845,"context_line":"        self.app.object_chunk_size \u003d 10"}],"source_content_type":"text/x-python","patch_set":1,"id":"6fc97d2b_e373abd2","line":1842,"in_reply_to":"5fc2936e_03defd20","updated":"2024-01-25 14:22:01.000000000","message":"Acknowledged","commit_id":"2059b1a90fe1f06a7c1844561bbeaff95c4bc865"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a3fed703bf02705e885170049996018f22a45b9e","unresolved":true,"context_lines":[{"line_number":5573,"context_line":"        self.assertEqual(0, len(error_lines))"},{"line_number":5574,"context_line":"        # the test is a little bogus - presumably if the range was complete"},{"line_number":5575,"context_line":"        # then the fragment would be ok to rebuild. But the test pretends range"},{"line_number":5576,"context_line":"        # was complete without actually feeding the bytes to the getter..."},{"line_number":5577,"context_line":"        warning_lines \u003d self.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":5578,"context_line":"        self.assertEqual(1, len(warning_lines))"},{"line_number":5579,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":1,"id":"601ec48b_38c88efc","line":5576,"updated":"2023-11-02 18:49:05.000000000","message":"maybe a better test can be constructed, but I didn\u0027t yet have time to invest in that","commit_id":"2059b1a90fe1f06a7c1844561bbeaff95c4bc865"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":5573,"context_line":"        self.assertEqual(0, len(error_lines))"},{"line_number":5574,"context_line":"        # the test is a little bogus - presumably if the range was complete"},{"line_number":5575,"context_line":"        # then the fragment would be ok to rebuild. But the test pretends range"},{"line_number":5576,"context_line":"        # was complete without actually feeding the bytes to the getter..."},{"line_number":5577,"context_line":"        warning_lines \u003d self.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":5578,"context_line":"        self.assertEqual(1, len(warning_lines))"},{"line_number":5579,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":1,"id":"7ed9e957_08af1cbd","line":5576,"in_reply_to":"601ec48b_38c88efc","updated":"2023-12-05 20:06:14.000000000","message":"but this is *new* test?\n\nI can see that fast_forward *can* raise a RangeAlreadyComplete error; but at first I thought it was doing so to indciate there was a bug in the caller.\n\nIf I pull out the catch RangeAlreadyComplete from the base controller\n\nhttps://github.com/NVIDIA/swift/blob/master/swift/proxy/controllers/base.py#L1393\n\n... then I get a failure in \n\nswift/test/unit/proxy/test_server.py::TestReplicatedObjectController::test_GET_ranges_resuming\n\nhttps://github.com/NVIDIA/swift/blob/master/test/unit/proxy/test_server.py#L3383\n\nwhich is doing a multi-range request.  I hate multi-range requests.\n\nit seems to pass if I guard the call into fast forward with \"if not nbytes: break\"\n\nI don\u0027t really understand how multi-range requests work with EC 😞","commit_id":"2059b1a90fe1f06a7c1844561bbeaff95c4bc865"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":5573,"context_line":"        self.assertEqual(0, len(error_lines))"},{"line_number":5574,"context_line":"        # the test is a little bogus - presumably if the range was complete"},{"line_number":5575,"context_line":"        # then the fragment would be ok to rebuild. But the test pretends range"},{"line_number":5576,"context_line":"        # was complete without actually feeding the bytes to the getter..."},{"line_number":5577,"context_line":"        warning_lines \u003d self.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":5578,"context_line":"        self.assertEqual(1, len(warning_lines))"},{"line_number":5579,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":1,"id":"efac83f7_1feb5c0d","line":5576,"in_reply_to":"7ed9e957_08af1cbd","updated":"2024-01-25 14:22:01.000000000","message":"Acknowledged","commit_id":"2059b1a90fe1f06a7c1844561bbeaff95c4bc865"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":5517,"context_line":"            object_ring.get_nodes(\u0027account\u0027)"},{"line_number":5518,"context_line":"            for dev in object_ring.devs:"},{"line_number":5519,"context_line":"                dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5520,"context_line":"                dev[\u0027port\u0027] \u003d 1"},{"line_number":5521,"context_line":"            req \u003d Request.blank(\u0027/v1/a/c/o\u0027,"},{"line_number":5522,"context_line":"                                environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":5523,"context_line":"                                headers\u003d{\u0027Content-Length\u0027: \u00274\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"e7c1fa8e_249e4a69","side":"PARENT","line":5520,"updated":"2023-12-05 20:06:14.000000000","message":"unrelated: this weird setup isn\u0027t needed either\n\nhttps://review.opendev.org/c/openstack/swift/+/902724","commit_id":"c9d190f87e9a938417b6f48c1cd4d342c5b1991d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":5517,"context_line":"            object_ring.get_nodes(\u0027account\u0027)"},{"line_number":5518,"context_line":"            for dev in object_ring.devs:"},{"line_number":5519,"context_line":"                dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5520,"context_line":"                dev[\u0027port\u0027] \u003d 1"},{"line_number":5521,"context_line":"            req \u003d Request.blank(\u0027/v1/a/c/o\u0027,"},{"line_number":5522,"context_line":"                                environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":5523,"context_line":"                                headers\u003d{\u0027Content-Length\u0027: \u00274\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"6e261056_35ea37ef","side":"PARENT","line":5520,"in_reply_to":"e7c1fa8e_249e4a69","updated":"2024-01-25 14:22:01.000000000","message":"Done","commit_id":"c9d190f87e9a938417b6f48c1cd4d342c5b1991d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":5430,"context_line":"        for dev in self.app.account_ring.devs:"},{"line_number":5431,"context_line":"            dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5432,"context_line":"            dev[\u0027port\u0027] \u003d 1"},{"line_number":5433,"context_line":"        self.app.container_ring.get_nodes(\u0027account\u0027)"},{"line_number":5434,"context_line":"        for dev in self.app.container_ring.devs:"},{"line_number":5435,"context_line":"            dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5436,"context_line":"            dev[\u0027port\u0027] \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"c81df58d_6ac04a7d","line":5433,"updated":"2023-12-05 20:06:14.000000000","message":"what\u0027s the significance of asking the container_ring to get_nodes for just \"account\" - we don\u0027t use the return value and the test seems to pass w/o this (existing) call.","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":5430,"context_line":"        for dev in self.app.account_ring.devs:"},{"line_number":5431,"context_line":"            dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5432,"context_line":"            dev[\u0027port\u0027] \u003d 1"},{"line_number":5433,"context_line":"        self.app.container_ring.get_nodes(\u0027account\u0027)"},{"line_number":5434,"context_line":"        for dev in self.app.container_ring.devs:"},{"line_number":5435,"context_line":"            dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5436,"context_line":"            dev[\u0027port\u0027] \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"3927b9a0_7a000dd1","line":5433,"in_reply_to":"c81df58d_6ac04a7d","updated":"2024-01-25 14:22:01.000000000","message":"Acknowledged","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":5438,"context_line":"        object_ring.get_nodes(\u0027account\u0027)"},{"line_number":5439,"context_line":"        for dev in object_ring.devs:"},{"line_number":5440,"context_line":"            dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5441,"context_line":"            dev[\u0027port\u0027] \u003d 1"},{"line_number":5442,"context_line":"        self.app.recoverable_node_timeout \u003d 0.2"},{"line_number":5443,"context_line":""},{"line_number":5444,"context_line":"        self.logger.clear()"}],"source_content_type":"text/x-python","patch_set":4,"id":"8eb35e46_e8716aec","line":5441,"updated":"2023-12-05 20:06:14.000000000","message":"ok, all devices are on the same node - that\u0027s reasonable enough I suppose; maybe it makes some assertions easier (but presumably the device/path is still different?)\n\nI recognize this is all pre-existing; but none of it seems needed.","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":5438,"context_line":"        object_ring.get_nodes(\u0027account\u0027)"},{"line_number":5439,"context_line":"        for dev in object_ring.devs:"},{"line_number":5440,"context_line":"            dev[\u0027ip\u0027] \u003d \u0027127.0.0.1\u0027"},{"line_number":5441,"context_line":"            dev[\u0027port\u0027] \u003d 1"},{"line_number":5442,"context_line":"        self.app.recoverable_node_timeout \u003d 0.2"},{"line_number":5443,"context_line":""},{"line_number":5444,"context_line":"        self.logger.clear()"}],"source_content_type":"text/x-python","patch_set":4,"id":"662676c1_765abd52","line":5441,"in_reply_to":"8eb35e46_e8716aec","updated":"2024-01-25 14:22:01.000000000","message":"Done","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":5446,"context_line":"        self.app.update_request(req)"},{"line_number":5447,"context_line":"        # account HEAD, container HEAD, obj GET x 3"},{"line_number":5448,"context_line":"        set_http_connect(200, 200, 200, 200, 200, body\u003db\u0027lalala\u0027,"},{"line_number":5449,"context_line":"                         slow\u003dslow, etags\u003detags)"},{"line_number":5450,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":5451,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":5452,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":4,"id":"7214923e_63b9b17c","line":5449,"updated":"2023-12-05 20:06:14.000000000","message":"where are the object handoff/resume requests?\n\nTurns out this ring only has three devices:\n\nhttps://review.opendev.org/c/openstack/swift/+/902724","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":5446,"context_line":"        self.app.update_request(req)"},{"line_number":5447,"context_line":"        # account HEAD, container HEAD, obj GET x 3"},{"line_number":5448,"context_line":"        set_http_connect(200, 200, 200, 200, 200, body\u003db\u0027lalala\u0027,"},{"line_number":5449,"context_line":"                         slow\u003dslow, etags\u003detags)"},{"line_number":5450,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":5451,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":5452,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":4,"id":"cc5daa59_4280b9e6","line":5449,"in_reply_to":"7214923e_63b9b17c","updated":"2024-01-25 14:22:01.000000000","message":"Acknowledged","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":5448,"context_line":"        set_http_connect(200, 200, 200, 200, 200, body\u003db\u0027lalala\u0027,"},{"line_number":5449,"context_line":"                         slow\u003dslow, etags\u003detags)"},{"line_number":5450,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":5451,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":5452,"context_line":"        return resp"},{"line_number":5453,"context_line":""},{"line_number":5454,"context_line":"    def test_node_read_timeout_retry_three_time_out(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"d06515a3_572b1fa8","line":5451,"updated":"2023-12-05 20:06:14.000000000","message":"all users of this helper expect the initial response/headers to come back 200 OK, and only hit ChunkTimeout when trying to read the body.","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":5448,"context_line":"        set_http_connect(200, 200, 200, 200, 200, body\u003db\u0027lalala\u0027,"},{"line_number":5449,"context_line":"                         slow\u003dslow, etags\u003detags)"},{"line_number":5450,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":5451,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":5452,"context_line":"        return resp"},{"line_number":5453,"context_line":""},{"line_number":5454,"context_line":"    def test_node_read_timeout_retry_three_time_out(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df525560_375ea989","line":5451,"in_reply_to":"d06515a3_572b1fa8","updated":"2024-01-25 14:22:01.000000000","message":"correct, comment added to that effect","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"809642ecd4df7a7e5e854f73d7b18e00aae8c768","unresolved":true,"context_lines":[{"line_number":11137,"context_line":"            self.assertEqual(timestamp, timestamps[0])"},{"line_number":11138,"context_line":"            self.assertTrue(re.match(r\u0027[0-9]{10}\\.[0-9]{5}\u0027, timestamp))"},{"line_number":11139,"context_line":""},{"line_number":11140,"context_line":"    def test_node_read_timeout_no_retry_to_container(self):"},{"line_number":11141,"context_line":"        with save_globals():"},{"line_number":11142,"context_line":"            req \u003d Request.blank(\u0027/v1/a/c\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":11143,"context_line":"            self.app.node_timeout \u003d 0.1"}],"source_content_type":"text/x-python","patch_set":4,"id":"9b6fa625_8697b4b6","line":11140,"updated":"2023-12-05 20:06:14.000000000","message":"oh that existing test was weird, behavior assertions look consistent.","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a8a8b1db057832afc28cc58765c8168adf0fe3e2","unresolved":false,"context_lines":[{"line_number":11137,"context_line":"            self.assertEqual(timestamp, timestamps[0])"},{"line_number":11138,"context_line":"            self.assertTrue(re.match(r\u0027[0-9]{10}\\.[0-9]{5}\u0027, timestamp))"},{"line_number":11139,"context_line":""},{"line_number":11140,"context_line":"    def test_node_read_timeout_no_retry_to_container(self):"},{"line_number":11141,"context_line":"        with save_globals():"},{"line_number":11142,"context_line":"            req \u003d Request.blank(\u0027/v1/a/c\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":11143,"context_line":"            self.app.node_timeout \u003d 0.1"}],"source_content_type":"text/x-python","patch_set":4,"id":"721a5434_82489455","line":11140,"in_reply_to":"9b6fa625_8697b4b6","updated":"2024-01-25 14:22:01.000000000","message":"Acknowledged","commit_id":"a00132523c175e7a57f168dbfb98342f42d00783"}]}
