)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"344abe10fe61ceae26b4b7faa7d7de6eac087eb0","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-09 09:33:58 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Object-server: add http exception handling for object request timing stats"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Idc4b52de0a04ebfc0e353162bd791d4e0e20eac3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ff900697_8308d21b","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":14},"updated":"2025-05-09 16:20:51.000000000","message":"the fix actually applies to all server types, although the test highlights the bug in the object server PUT wrapper","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c2b6d41b07515abc38a6d644cdf7ce11752f98bf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-09 09:33:58 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Object-server: add http exception handling for object request timing stats"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Idc4b52de0a04ebfc0e353162bd791d4e0e20eac3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"e3d869b7_84457840","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":14},"in_reply_to":"ff900697_8308d21b","updated":"2025-05-12 16:16:12.000000000","message":"Acknowledged","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"536096d312cf34b81412ae6e2370c92a605863cc","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-12 09:53:16 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"common: add http exception handling for base storage server timing stats"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":10,"context_line":"Change-Id: Idc4b52de0a04ebfc0e353162bd791d4e0e20eac3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"78b4361b_271b97d0","line":7,"updated":"2025-05-16 13:16:01.000000000","message":"nit: I\u0027d encourage you to add a little more context/explanation in the commit message to help future us understand why less-obvious changes were made. In this case, perhaps:\n\n```\nThe timing stats decorators are moved from utils to base_storage_server.py to avoid a circular import of HTTPException.\n```","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24dca3428bbc35b1cd63435f2803daec51f48a4e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-12 09:53:16 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"common: add http exception handling for base storage server timing stats"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":10,"context_line":"Change-Id: Idc4b52de0a04ebfc0e353162bd791d4e0e20eac3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"64c365e2_37466626","line":7,"in_reply_to":"78b4361b_271b97d0","updated":"2025-05-19 11:19:56.000000000","message":"Done","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"344abe10fe61ceae26b4b7faa7d7de6eac087eb0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"24cff869_b4494d6b","updated":"2025-05-09 16:20:51.000000000","message":"-1 because more focussed test case needed.\n\nThe bug fix looks good but when I revert the change to catch HTTPExceptions I don\u0027t see any tests fail in test_base_storage_server.py. I would expect to see some new test cases in test_base_storage_server.py to explicitly raise an HTTPException in the wrapped function.","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"536096d312cf34b81412ae6e2370c92a605863cc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b8b124ef_1aed5135","updated":"2025-05-16 13:16:01.000000000","message":"I\u0027d still like to see new tests directly on the decorator to cover the bug fix: see https://review.opendev.org/c/openstack/swift/+/950162","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1d9894c6c83c3a070932cc492c9c3e967c1ea8e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4048fe8d_777e945f","updated":"2025-05-19 11:13:39.000000000","message":"recheck\n\ngrenade test timed out uploading logs?","commit_id":"ec6e8bd203651ad6a7a2aa5750a2226f5899f0a9"}],"swift/common/base_storage_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"344abe10fe61ceae26b4b7faa7d7de6eac087eb0","unresolved":true,"context_lines":[{"line_number":44,"context_line":"                resp \u003d func("},{"line_number":45,"context_line":"                    ctrl, req, *args, timing_stats_labels\u003dlabels, **kwargs)"},{"line_number":46,"context_line":"            except HTTPException as e:"},{"line_number":47,"context_line":"                resp \u003d e"},{"line_number":48,"context_line":"            labels[\u0027method\u0027] \u003d req_method"},{"line_number":49,"context_line":"            labels[\u0027status\u0027] \u003d resp.status_int"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1d2e5fb9_f8c49d38","line":47,"updated":"2025-05-09 16:20:51.000000000","message":"AFAICT this isn\u0027t covered by a test in obj/test_server.py whereas the legacy timing_stats change is covered in test_server.py","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c2b6d41b07515abc38a6d644cdf7ce11752f98bf","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                resp \u003d func("},{"line_number":45,"context_line":"                    ctrl, req, *args, timing_stats_labels\u003dlabels, **kwargs)"},{"line_number":46,"context_line":"            except HTTPException as e:"},{"line_number":47,"context_line":"                resp \u003d e"},{"line_number":48,"context_line":"            labels[\u0027method\u0027] \u003d req_method"},{"line_number":49,"context_line":"            labels[\u0027status\u0027] \u003d resp.status_int"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"87a291cf_ccf1d64b","line":47,"in_reply_to":"1d2e5fb9_f8c49d38","updated":"2025-05-12 16:16:12.000000000","message":"Acknowledged","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"344abe10fe61ceae26b4b7faa7d7de6eac087eb0","unresolved":true,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        self.assertIsInstance(statsd_client, FakeStatsdClient)"},{"line_number":246,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"},{"line_number":247,"context_line":"        return statsd_client, statsd, resp"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate(self):"},{"line_number":250,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":1,"id":"508dc093_196bef8e","line":247,"updated":"2025-05-09 16:20:51.000000000","message":"Is this change needed? I couldn\u0027t find anywhere that ``resp`` is used","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c2b6d41b07515abc38a6d644cdf7ce11752f98bf","unresolved":false,"context_lines":[{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        self.assertIsInstance(statsd_client, FakeStatsdClient)"},{"line_number":246,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"},{"line_number":247,"context_line":"        return statsd_client, statsd, resp"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate(self):"},{"line_number":250,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":1,"id":"a4e66954_2b58d4aa","line":247,"in_reply_to":"508dc093_196bef8e","updated":"2025-05-12 16:16:12.000000000","message":"Acknowledged","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"344abe10fe61ceae26b4b7faa7d7de6eac087eb0","unresolved":true,"context_lines":[{"line_number":312,"context_line":"                \u0027sample_rate\u0027: 0.1"},{"line_number":313,"context_line":"            })]},"},{"line_number":314,"context_line":"            statsd.calls)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate_507(self):"},{"line_number":317,"context_line":"        req \u003d Request.blank("},{"line_number":318,"context_line":"            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027})"}],"source_content_type":"text/x-python","patch_set":1,"id":"75940694_eb2fce5e","line":315,"updated":"2025-05-09 16:20:51.000000000","message":"we could add this tests here:\n\n```\n    def test_legacy_and_labeled_timing_stats_replicate_bad_policy(self):\n        # non-existent policy\n        req \u003d Request.blank(\n            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027},\n            headers\u003d{\u0027X-Backend-Storage-Policy-Index\u0027: \u002799\u0027}\n        )\n        now \u003d time()\n        statsd_client, statsd, _ \u003d self._do_test_timing_stats(\n            self.conf, req, now)\n        self.assertEqual({\u0027timing_since\u0027: [((\u0027REPLICATE.errors.timing\u0027, now), {\n           \u0027sample_rate\u0027: 0.1\n        })]}, statsd_client.calls)\n        self.assertEqual(\n            {\u0027timing_since\u0027: [((\u0027swift_object_server_request_timing\u0027, now), {\n                \u0027labels\u0027: {\n                    \u0027method\u0027: \u0027REPLICATE\u0027,\n                    \u0027status\u0027: 503\n                },\n                \u0027sample_rate\u0027: 0.1\n            })]},\n            statsd.calls)\n\n```","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c2b6d41b07515abc38a6d644cdf7ce11752f98bf","unresolved":false,"context_lines":[{"line_number":312,"context_line":"                \u0027sample_rate\u0027: 0.1"},{"line_number":313,"context_line":"            })]},"},{"line_number":314,"context_line":"            statsd.calls)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate_507(self):"},{"line_number":317,"context_line":"        req \u003d Request.blank("},{"line_number":318,"context_line":"            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027})"}],"source_content_type":"text/x-python","patch_set":1,"id":"966c9447_3741187f","line":315,"in_reply_to":"75940694_eb2fce5e","updated":"2025-05-12 16:16:12.000000000","message":"Thanks Al!","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"344abe10fe61ceae26b4b7faa7d7de6eac087eb0","unresolved":true,"context_lines":[{"line_number":335,"context_line":"            })]},"},{"line_number":336,"context_line":"            statsd.calls)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _do_test_legacy_timing_stats_error(self, req, sample_rate\u003dNone):"},{"line_number":339,"context_line":"        now \u003d time()"},{"line_number":340,"context_line":"        # mount_check will provoke a 507"},{"line_number":341,"context_line":"        conf \u003d dict(self.conf, mount_check\u003d\u0027true\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"80ffe767_2d9a1211","line":338,"range":{"start_line":338,"start_character":54,"end_line":338,"end_character":71},"updated":"2025-05-09 16:20:51.000000000","message":"sample_rate is never passed, and the helper is only used once.\n\nI guess you may be thinking ahead to your next patch, but for now I suggest collapsing this down into the test_legacy_timing_stats_put_error method\n\nOR...add a test case for another request method, or usnig sample_rate, to justify the helper method","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c2b6d41b07515abc38a6d644cdf7ce11752f98bf","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            })]},"},{"line_number":336,"context_line":"            statsd.calls)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _do_test_legacy_timing_stats_error(self, req, sample_rate\u003dNone):"},{"line_number":339,"context_line":"        now \u003d time()"},{"line_number":340,"context_line":"        # mount_check will provoke a 507"},{"line_number":341,"context_line":"        conf \u003d dict(self.conf, mount_check\u003d\u0027true\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"8e32843e_93f067d7","line":338,"range":{"start_line":338,"start_character":54,"end_line":338,"end_character":71},"in_reply_to":"80ffe767_2d9a1211","updated":"2025-05-12 16:16:12.000000000","message":"Acknowledged","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"344abe10fe61ceae26b4b7faa7d7de6eac087eb0","unresolved":true,"context_lines":[{"line_number":345,"context_line":"            \u0027timing_since\u0027: [((req.method + \u0027.errors.timing\u0027, now), kwargs)]"},{"line_number":346,"context_line":"        }, statsd_client.calls)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def test_legacy_timing_stats_put_error(self):"},{"line_number":349,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":350,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":351,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf738ccf_ee5df394","line":348,"range":{"start_line":348,"start_character":33,"end_line":348,"end_character":42},"updated":"2025-05-09 16:20:51.000000000","message":"nit: for the REPLICATE case this test explicitly had ``_507`` at the end of the name","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c2b6d41b07515abc38a6d644cdf7ce11752f98bf","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            \u0027timing_since\u0027: [((req.method + \u0027.errors.timing\u0027, now), kwargs)]"},{"line_number":346,"context_line":"        }, statsd_client.calls)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def test_legacy_timing_stats_put_error(self):"},{"line_number":349,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":350,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":351,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"c75b32f6_d9efce59","line":348,"range":{"start_line":348,"start_character":33,"end_line":348,"end_character":42},"in_reply_to":"bf738ccf_ee5df394","updated":"2025-05-12 16:16:12.000000000","message":"Acknowledged","commit_id":"d0c3b83b6ecf60cd8a9cb900873b56e7bb8ef2c5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"536096d312cf34b81412ae6e2370c92a605863cc","unresolved":true,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            with mock.patch.object(statsd_client, \u0027random\u0027, return_value\u003d0), \\"},{"line_number":242,"context_line":"                    mock.patch.object(statsd, \u0027random\u0027, return_value\u003d0):"},{"line_number":243,"context_line":"                req.get_response(app)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        self.assertIsInstance(statsd_client, FakeStatsdClient)"},{"line_number":246,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5bab393e_0dfa723e","line":243,"updated":"2025-05-16 13:16:01.000000000","message":"nit: unnecessary change (although harmless)","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24dca3428bbc35b1cd63435f2803daec51f48a4e","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            with mock.patch.object(statsd_client, \u0027random\u0027, return_value\u003d0), \\"},{"line_number":242,"context_line":"                    mock.patch.object(statsd, \u0027random\u0027, return_value\u003d0):"},{"line_number":243,"context_line":"                req.get_response(app)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        self.assertIsInstance(statsd_client, FakeStatsdClient)"},{"line_number":246,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"}],"source_content_type":"text/x-python","patch_set":2,"id":"343d6939_158d90dd","line":243,"in_reply_to":"5bab393e_0dfa723e","updated":"2025-05-19 11:19:56.000000000","message":"Done","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"536096d312cf34b81412ae6e2370c92a605863cc","unresolved":true,"context_lines":[{"line_number":335,"context_line":"            })]},"},{"line_number":336,"context_line":"            statsd.calls)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate_bad_policy(self):"},{"line_number":339,"context_line":"        # non-existent policy"},{"line_number":340,"context_line":"        req \u003d Request.blank("},{"line_number":341,"context_line":"            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027},"}],"source_content_type":"text/x-python","patch_set":2,"id":"8490be6b_8d707535","line":338,"updated":"2025-05-16 13:16:01.000000000","message":"ok, so this is currently the only method that has labeled metrics","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24dca3428bbc35b1cd63435f2803daec51f48a4e","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            })]},"},{"line_number":336,"context_line":"            statsd.calls)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate_bad_policy(self):"},{"line_number":339,"context_line":"        # non-existent policy"},{"line_number":340,"context_line":"        req \u003d Request.blank("},{"line_number":341,"context_line":"            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027},"}],"source_content_type":"text/x-python","patch_set":2,"id":"db3822eb_bf977a84","line":338,"in_reply_to":"8490be6b_8d707535","updated":"2025-05-19 11:19:56.000000000","message":"Acknowledged","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"536096d312cf34b81412ae6e2370c92a605863cc","unresolved":true,"context_lines":[{"line_number":404,"context_line":"            headers\u003d{\u0027X-Backend-Storage-Policy-Index\u0027: \u002799\u0027}"},{"line_number":405,"context_line":"        )"},{"line_number":406,"context_line":"        now \u003d time()"},{"line_number":407,"context_line":"        statsd_client, statsd \u003d self._do_test_timing_stats("},{"line_number":408,"context_line":"            self.conf, req, now)"},{"line_number":409,"context_line":"        self.assertEqual({\u0027timing_since\u0027: [((\u0027SSYNC.errors.timing\u0027, now), {"},{"line_number":410,"context_line":"            \u0027sample_rate\u0027: 0.1"}],"source_content_type":"text/x-python","patch_set":2,"id":"4c4d0510_924677c1","line":407,"updated":"2025-05-16 13:16:01.000000000","message":"is there a reason why this test cannot use ``self._do_test_legacy_timing_stats_error(req)\n`` ?","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"94c4da3ec193346b980f5fdaae421ecaeeaaf50b","unresolved":false,"context_lines":[{"line_number":404,"context_line":"            headers\u003d{\u0027X-Backend-Storage-Policy-Index\u0027: \u002799\u0027}"},{"line_number":405,"context_line":"        )"},{"line_number":406,"context_line":"        now \u003d time()"},{"line_number":407,"context_line":"        statsd_client, statsd \u003d self._do_test_timing_stats("},{"line_number":408,"context_line":"            self.conf, req, now)"},{"line_number":409,"context_line":"        self.assertEqual({\u0027timing_since\u0027: [((\u0027SSYNC.errors.timing\u0027, now), {"},{"line_number":410,"context_line":"            \u0027sample_rate\u0027: 0.1"}],"source_content_type":"text/x-python","patch_set":2,"id":"86f2a412_efba1c2b","line":407,"in_reply_to":"4c4d0510_924677c1","updated":"2025-05-19 16:32:19.000000000","message":"in the follow-up patch for object server requests labeled timing stats, more unit tests for labeled timing stats were added, thus added _do_test_legacy_and_labeled_timing_stats_bad_policy helper functions. which would be used by this unit test","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"536096d312cf34b81412ae6e2370c92a605863cc","unresolved":true,"context_lines":[{"line_number":408,"context_line":"            self.conf, req, now)"},{"line_number":409,"context_line":"        self.assertEqual({\u0027timing_since\u0027: [((\u0027SSYNC.errors.timing\u0027, now), {"},{"line_number":410,"context_line":"            \u0027sample_rate\u0027: 0.1"},{"line_number":411,"context_line":"        })]}, statsd_client.calls)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def test_legacy_timing_stats_put_error(self):"},{"line_number":414,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":2,"id":"0ead2ac1_3f0dc836","line":411,"updated":"2025-05-16 13:16:01.000000000","message":"ok, fails when I revert the change\n\n```\nE   AssertionError: {\u0027timing_since\u0027: [((\u0027SSYNC.errors.timing\u0027[40 chars]1})]} !\u003d defaultdict(\u003cclass \u0027list\u0027\u003e, {})\n```","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24dca3428bbc35b1cd63435f2803daec51f48a4e","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            self.conf, req, now)"},{"line_number":409,"context_line":"        self.assertEqual({\u0027timing_since\u0027: [((\u0027SSYNC.errors.timing\u0027, now), {"},{"line_number":410,"context_line":"            \u0027sample_rate\u0027: 0.1"},{"line_number":411,"context_line":"        })]}, statsd_client.calls)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def test_legacy_timing_stats_put_error(self):"},{"line_number":414,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":2,"id":"8c1c754a_aa2451a5","line":411,"in_reply_to":"0ead2ac1_3f0dc836","updated":"2025-05-19 11:19:56.000000000","message":"Acknowledged","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"536096d312cf34b81412ae6e2370c92a605863cc","unresolved":true,"context_lines":[{"line_number":419,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":420,"context_line":"                            headers\u003dheaders)"},{"line_number":421,"context_line":"        req.body \u003d b\u0027VERIFY\u0027"},{"line_number":422,"context_line":"        self._do_test_legacy_timing_stats_error(req)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def test_REQUEST_SPECIAL_CHARS(self):"},{"line_number":425,"context_line":"        obj \u003d \u0027special昆%20/%\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"a028a7ce_1e531cb2","line":422,"updated":"2025-05-16 13:16:01.000000000","message":"great! this fails when I revert the change\n\n```\nFAILED\ntest/unit/obj/test_server.py:409 (TestObjectController.test_legacy_timing_stats_put_error)\ndefaultdict(\u003cclass \u0027list\u0027\u003e, {}) !\u003d {\u0027timing_since\u0027: [((\u0027PUT.errors.timing\u0027, 1747400105.0024781), {})]}\n\nExpected :{\u0027timing_since\u0027: [((\u0027PUT.errors.timing\u0027, 1747400105.0024781), {})]}\nActual   :defaultdict(\u003cclass \u0027list\u0027\u003e, {})\n\u003cClick to see difference\u003e\n```","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"24dca3428bbc35b1cd63435f2803daec51f48a4e","unresolved":false,"context_lines":[{"line_number":419,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":420,"context_line":"                            headers\u003dheaders)"},{"line_number":421,"context_line":"        req.body \u003d b\u0027VERIFY\u0027"},{"line_number":422,"context_line":"        self._do_test_legacy_timing_stats_error(req)"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"    def test_REQUEST_SPECIAL_CHARS(self):"},{"line_number":425,"context_line":"        obj \u003d \u0027special昆%20/%\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"4887288d_77320204","line":422,"in_reply_to":"a028a7ce_1e531cb2","updated":"2025-05-19 11:19:56.000000000","message":"Acknowledged","commit_id":"69bb2360e1c45c9a84b81c6531b36ca905dff1ee"}]}
