)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ad9dc4005febe61bb1b68193ce329275dbb9da40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"49cdbe8f_bf4ff213","updated":"2025-11-04 00:11:28.000000000","message":"thanks Jian!","commit_id":"2fee42125df91918b8b1f022c3e3e3b1622233cb"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ad9dc4005febe61bb1b68193ce329275dbb9da40","unresolved":true,"context_lines":[{"line_number":960,"context_line":"        if self.policy_type \u003d\u003d REPL_POLICY and \\"},{"line_number":961,"context_line":"                len(results) \u003e obj_ring.replica_count:"},{"line_number":962,"context_line":"            quorum \u003d self._quorum_size(obj_ring.replica_count)"},{"line_number":963,"context_line":"        else:"},{"line_number":964,"context_line":"            quorum \u003d None"},{"line_number":965,"context_line":""},{"line_number":966,"context_line":"        return self.best_response(req, statuses, reasons, bodies,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ef8c5cf_f5218ef6","line":963,"updated":"2025-11-04 00:11:28.000000000","message":"result-count-based quorum is nuts:\n```\n        if quorum_size is None:\n            quorum_size \u003d self._quorum_size(len(statuses))\n```\n\n... other places in that same module we spell a more reasonable:\n\n```\n        if quorum is None:\n            quorum \u003d self._quorum_size(node_count)\n```\n\n... but I don\u0027t see an obvious way to get the replica_count off the controller.","commit_id":"2fee42125df91918b8b1f022c3e3e3b1622233cb"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e10e8d248c78a4e2a61e94def798f5982e51f7eb","unresolved":true,"context_lines":[{"line_number":1483,"context_line":"        codes \u003d primary_codes + handoff_codes"},{"line_number":1484,"context_line":"        with mocked_http_conn(*codes) as log:"},{"line_number":1485,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1486,"context_line":"        self.assertEqual(202, resp.status_int,"},{"line_number":1487,"context_line":"                         \u0027replicas \u003d %s\u0027 % self.replicas())"},{"line_number":1488,"context_line":"        requested_nodes \u003d [r[\u0027ip\u0027] for r in log.requests]"},{"line_number":1489,"context_line":"        self.assertEqual(len(requested_nodes), len(set(requested_nodes)))"}],"source_content_type":"text/x-python","patch_set":1,"id":"1027e765_f9c88440","line":1486,"updated":"2025-10-31 21:04:16.000000000","message":"this would return 404 with changes from https://review.opendev.org/c/openstack/swift/+/956411/5","commit_id":"2fee42125df91918b8b1f022c3e3e3b1622233cb"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"59aab5631b76bc6b0f2196d23f8dbf4cc549fe5b","unresolved":true,"context_lines":[{"line_number":1483,"context_line":"        codes \u003d primary_codes + handoff_codes"},{"line_number":1484,"context_line":"        with mocked_http_conn(*codes) as log:"},{"line_number":1485,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1486,"context_line":"        self.assertEqual(202, resp.status_int,"},{"line_number":1487,"context_line":"                         \u0027replicas \u003d %s\u0027 % self.replicas())"},{"line_number":1488,"context_line":"        requested_nodes \u003d [r[\u0027ip\u0027] for r in log.requests]"},{"line_number":1489,"context_line":"        self.assertEqual(len(requested_nodes), len(set(requested_nodes)))"}],"source_content_type":"text/x-python","patch_set":1,"id":"d6c9d48a_2aa01a11","line":1486,"in_reply_to":"1027e765_f9c88440","updated":"2025-11-03 21:30:02.000000000","message":"with ``\u0027x-backend-timestamp\u0027: None`` header added into handoff POST, this returns 503 because response codes are (404, 404, 202, 503, 202)","commit_id":"2fee42125df91918b8b1f022c3e3e3b1622233cb"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ad9dc4005febe61bb1b68193ce329275dbb9da40","unresolved":true,"context_lines":[{"line_number":1499,"context_line":"            return"},{"line_number":1500,"context_line":"        # Skip this test for EC policies"},{"line_number":1501,"context_line":"        if self.policy.policy_type !\u003d \u0027replication\u0027:"},{"line_number":1502,"context_line":"            self.skipTest(\u0027This test is only for replicated policy\u0027)"},{"line_number":1503,"context_line":"        primary_success \u003d quorum_size(self.replicas()) - 1"},{"line_number":1504,"context_line":"        primary_failure \u003d self.replicas() - primary_success"},{"line_number":1505,"context_line":"        primary_codes \u003d [404] * primary_failure + [202] * primary_success"}],"source_content_type":"text/x-python","patch_set":1,"id":"264a3121_8c1c8cb5","line":1502,"updated":"2025-11-04 00:11:28.000000000","message":"strange I think to start turning cranks if we\u0027re just going to end up skipping the test...\n\nalso there\u0027s a `class TestReplicatedObjController` in this module that should only run for replicated policies if that\u0027s really what we need.","commit_id":"2fee42125df91918b8b1f022c3e3e3b1622233cb"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e10e8d248c78a4e2a61e94def798f5982e51f7eb","unresolved":true,"context_lines":[{"line_number":1507,"context_line":"        codes \u003d primary_codes + handoff_codes"},{"line_number":1508,"context_line":"        with mocked_http_conn(*codes):"},{"line_number":1509,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1510,"context_line":"        self.assertEqual(503, resp.status_int,"},{"line_number":1511,"context_line":"                         \u0027replicas \u003d %s\u0027 % self.replicas())"},{"line_number":1512,"context_line":""},{"line_number":1513,"context_line":"    def test_POST_insufficient_primaries_others_fail_handoffs_404(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"4eb137da_17c02728","line":1510,"updated":"2025-10-31 21:04:16.000000000","message":"this would return 404 with changes from https://review.opendev.org/c/openstack/swift/+/956411/5","commit_id":"2fee42125df91918b8b1f022c3e3e3b1622233cb"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"2d424de5f6de584f29d52f31e876a5e83d7ac2d2","unresolved":true,"context_lines":[{"line_number":1507,"context_line":"        codes \u003d primary_codes + handoff_codes"},{"line_number":1508,"context_line":"        with mocked_http_conn(*codes):"},{"line_number":1509,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1510,"context_line":"        self.assertEqual(503, resp.status_int,"},{"line_number":1511,"context_line":"                         \u0027replicas \u003d %s\u0027 % self.replicas())"},{"line_number":1512,"context_line":""},{"line_number":1513,"context_line":"    def test_POST_insufficient_primaries_others_fail_handoffs_404(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"22d3fd6b_2d1c5e4d","line":1510,"in_reply_to":"4eb137da_17c02728","updated":"2025-11-03 21:05:16.000000000","message":"with ``\u0027x-backend-timestamp\u0027: None`` header added into handoff POST, this returns 503, because response codes are ``(404, 404, 202, 503, 503)``, so no quorum achieved when using the original result-count-based quorum; but when I switched to replica-based quorum, this would return 404.","commit_id":"2fee42125df91918b8b1f022c3e3e3b1622233cb"}]}
