)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"natemartes09@gmail.com","username":"nmartes"},"change_message_id":"cf88bf9362d5d058cf242e61491eae7ee2f41a44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"65ad0e09_fa2949ac","updated":"2026-09-08 12:08:03.000000000","message":"Overall I think this is mostly good! just a small concern with part sizes being too small...","commit_id":"2fe1f306fae62e5bb250b1d55069b6e593cd9512"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"natemartes09@gmail.com","username":"nmartes"},"change_message_id":"3f1fe6882264e2a4e39cf2b6549da37a46e0ca7c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"e213564f_96cc60ff","updated":"2026-09-19 20:02:38.000000000","message":"recheck","commit_id":"b3976fd167c2d9a7f7c722a24ed0fa5b6c6e9c6a"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"0b13a64f06e1a2980b842c9c529067994fdd4181","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"31ece59f_632482a4","updated":"2026-10-29 04:45:06.000000000","message":"thanks for the review!","commit_id":"735bda11bb703bc8ac4dfaa49467def570544216"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ce0fac4979be9675da32c0c0eff4181473177426","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"88939651_2d0cd9a0","updated":"2026-10-29 21:25:22.000000000","message":"LGTM! tested with \"allow_store_checksums\" config on VSAIO, got the following metric for example:\n# HELP swift_s3_complete_mpu Metric autogenerated by statsd_exporter.\n# TYPE swift_s3_complete_mpu counter\nswift_s3_complete_mpu{account\u003d\"AUTH_test\",checksum_algorithm\u003d\"CRC64NVME\",checksum_type\u003d\"FULL_OBJECT\",container\u003d\"testbucket\",outcome\u003d\"persisted\"} 1","commit_id":"6212cc02e38a002e9bb17819065391e886af2608"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dae2bdebed5a194500706fb5c78f0225b997e5bc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"fcb73751_3fea869a","updated":"2026-11-05 11:54:05.000000000","message":"Is the refactoring of the ``POST()`` method *necessary* to add the stat, or is just opportunistic? I think the refactor might be great, but I\u0027m nervous about a patch that has a lot of refactoring AND ~400 lines of test changes. I wonder if we could get the refactoring done first (with zero test changes) and then have a patch that is focussed on adding the metric. I might find that easier to review.","commit_id":"7b0b22c6caa4d9437e7bce367b37fec89ad815fc"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e2151d913c307e3f04bc23f152802aa1da7a357e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"aba71aa5_6fad34fc","updated":"2026-11-05 04:10:06.000000000","message":"Option-off missing-part tests requiring exactly one skipped_untrusted_part metric: https://review.opendev.org/c/openstack/swift/+/1014255","commit_id":"7b0b22c6caa4d9437e7bce367b37fec89ad815fc"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"89540ce7f7d50a50ea33d9b88662e1405d816249","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"d938fa07_cef95cd7","updated":"2026-11-10 15:00:46.000000000","message":"Run the compat tests on us-east-1 again, all except `test/s3api/test_input_errors.py::TestV4AuthQuery::test_get_object_invalid_sha` passing. The failed test is flaky on master and unrelated to the patch chain.","commit_id":"e94ef959e6e9b1ab5af01f7f7b6cd3fb69741edf"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"natemartes09@gmail.com","username":"nmartes"},"change_message_id":"cf88bf9362d5d058cf242e61491eae7ee2f41a44","unresolved":true,"context_lines":[{"line_number":1250,"context_line":"        \"\"\"Classify a CompleteMultipartUpload error.\"\"\""},{"line_number":1251,"context_line":"        if isinstance(err_resp, BadDigest):"},{"line_number":1252,"context_line":"            return \u0027bad_digest\u0027"},{"line_number":1253,"context_line":"        if isinstance(err_resp, (InvalidPart, InvalidPartOrder,"},{"line_number":1254,"context_line":"                                 InvalidArgument)):"},{"line_number":1255,"context_line":"            return \u0027invalid_part\u0027"},{"line_number":1256,"context_line":"        if isinstance(err_resp, (MalformedXML, InvalidRequest)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c55a7834_a79503bb","line":1253,"range":{"start_line":1253,"start_character":0,"end_line":1253,"end_character":2},"updated":"2026-09-08 12:08:03.000000000","message":"I think we may also need to include `EntityTooSmall` error aswell which should not be a `backend_error` I think `invalid_part` would be good and adding it to some unit tests that handle such case would be good too","commit_id":"2fe1f306fae62e5bb250b1d55069b6e593cd9512"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"9e9757dfcb451569257c78258b6a19e45e26afa4","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"        \"\"\"Classify a CompleteMultipartUpload error.\"\"\""},{"line_number":1251,"context_line":"        if isinstance(err_resp, BadDigest):"},{"line_number":1252,"context_line":"            return \u0027bad_digest\u0027"},{"line_number":1253,"context_line":"        if isinstance(err_resp, (InvalidPart, InvalidPartOrder,"},{"line_number":1254,"context_line":"                                 InvalidArgument)):"},{"line_number":1255,"context_line":"            return \u0027invalid_part\u0027"},{"line_number":1256,"context_line":"        if isinstance(err_resp, (MalformedXML, InvalidRequest)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c5580384_8597ca06","line":1253,"range":{"start_line":1253,"start_character":0,"end_line":1253,"end_character":2},"in_reply_to":"c55a7834_a79503bb","updated":"2026-09-19 00:23:01.000000000","message":"Done","commit_id":"2fe1f306fae62e5bb250b1d55069b6e593cd9512"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"natemartes09@gmail.com","username":"nmartes"},"change_message_id":"cf88bf9362d5d058cf242e61491eae7ee2f41a44","unresolved":false,"context_lines":[{"line_number":1669,"context_line":"                    # complete), so much the better."},{"line_number":1670,"context_line":"                    pass"},{"line_number":1671,"context_line":""},{"line_number":1672,"context_line":"                complete_body \u003d _make_complete_body("},{"line_number":1673,"context_line":"                    req, s3_etag, yielded_anything,"},{"line_number":1674,"context_line":"                    mpu_checksum_attrs.header,"},{"line_number":1675,"context_line":"                    manifest_hook.final_checksum_value,"}],"source_content_type":"text/x-python","patch_set":1,"id":"36187d99_8dd54ba6","line":1672,"range":{"start_line":1672,"start_character":0,"end_line":1672,"end_character":2},"updated":"2026-09-08 12:08:03.000000000","message":"I think at this point the proxy would have only sent the status code and some whitespace\nMy main concern this that this could run more than once, but it does not seem like it...","commit_id":"2fe1f306fae62e5bb250b1d55069b6e593cd9512"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"14cf1aac0ff176c157843989523885a803ca2c57","unresolved":true,"context_lines":[{"line_number":1397,"context_line":""},{"line_number":1398,"context_line":"        self.statsd.increment(\u0027swift_s3_complete_mpu\u0027, labels\u003d{"},{"line_number":1399,"context_line":"            \u0027outcome\u0027: outcome,"},{"line_number":1400,"context_line":"            \u0027account\u0027: req.account,"},{"line_number":1401,"context_line":"            \u0027container\u0027: req.container_name,"},{"line_number":1402,"context_line":"        })"},{"line_number":1403,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7d2db953_bb6e6c52","line":1400,"updated":"2026-09-18 16:16:31.000000000","message":"the req.account here is parsed from response environment PATH_INFO, since this is on response path, the response PATH_INFO is correct. although it would be better if we are using base_labels for account, contianer labels","commit_id":"dc306a2ec49c01fbe3a421280a9efd3d297b64a7"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"29471d18c106e9ad157ba67060a4a4e5176fc081","unresolved":false,"context_lines":[{"line_number":1397,"context_line":""},{"line_number":1398,"context_line":"        self.statsd.increment(\u0027swift_s3_complete_mpu\u0027, labels\u003d{"},{"line_number":1399,"context_line":"            \u0027outcome\u0027: outcome,"},{"line_number":1400,"context_line":"            \u0027account\u0027: req.account,"},{"line_number":1401,"context_line":"            \u0027container\u0027: req.container_name,"},{"line_number":1402,"context_line":"        })"},{"line_number":1403,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"f60d0764_d325d296","line":1400,"in_reply_to":"7d2db953_bb6e6c52","updated":"2026-09-18 21:53:24.000000000","message":"Done","commit_id":"dc306a2ec49c01fbe3a421280a9efd3d297b64a7"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"a2e9879a1c86d5fd3338652af7280fe1b0ffa6ec","unresolved":false,"context_lines":[{"line_number":1349,"context_line":"        # fails the SLO manifest PUT with a 503"},{"line_number":1350,"context_line":"        if (isinstance(err_resp, InvalidRequest) and"},{"line_number":1351,"context_line":"                500 \u003c\u003d err_resp.status_int \u003c 600):"},{"line_number":1352,"context_line":"            return \u0027backend_error\u0027"},{"line_number":1353,"context_line":"        if isinstance(err_resp, (MalformedXML, InvalidRequest)):"},{"line_number":1354,"context_line":"            return \u0027invalid_request\u0027"},{"line_number":1355,"context_line":"        if isinstance(err_resp, PreconditionFailed):"}],"source_content_type":"text/x-python","patch_set":11,"id":"b0ba7389_4983bebf","line":1352,"updated":"2026-10-28 03:33:36.000000000","message":"this is the fix with regard to the case in https://review.opendev.org/c/openstack/swift/+/1004560/11/test/unit/common/middleware/s3api/test_multi_upload.py#5977","commit_id":"9f4681754fd9ed4fd8ad9953d08bc026e03b2f20"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"a2e9879a1c86d5fd3338652af7280fe1b0ffa6ec","unresolved":false,"context_lines":[{"line_number":1352,"context_line":"            return \u0027backend_error\u0027"},{"line_number":1353,"context_line":"        if isinstance(err_resp, (MalformedXML, InvalidRequest)):"},{"line_number":1354,"context_line":"            return \u0027invalid_request\u0027"},{"line_number":1355,"context_line":"        if isinstance(err_resp, PreconditionFailed):"},{"line_number":1356,"context_line":"            return \u0027precondition_failed\u0027"},{"line_number":1357,"context_line":"        if isinstance(err_resp, S3NotImplemented):"},{"line_number":1358,"context_line":"            return \u0027unsupported\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"4081276b_19b1bac7","line":1355,"updated":"2026-10-28 03:33:36.000000000","message":"another fix with regard to the case in https://review.opendev.org/c/openstack/swift/+/1004560/11/test/unit/common/middleware/s3api/test_multi_upload.py#5977","commit_id":"9f4681754fd9ed4fd8ad9953d08bc026e03b2f20"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c80d3122cadca3c15715a433a143c4ef9fe012f9","unresolved":true,"context_lines":[{"line_number":1334,"context_line":"        self.statsd.increment(\u0027swift_s3_complete_mpu\u0027, labels\u003d{"},{"line_number":1335,"context_line":"            \u0027outcome\u0027: outcome,"},{"line_number":1336,"context_line":"            \u0027account\u0027: base_labels.get(\u0027account\u0027, req.account),"},{"line_number":1337,"context_line":"            \u0027container\u0027: base_labels.get(\u0027container\u0027, req.container_name),"},{"line_number":1338,"context_line":"        })"},{"line_number":1339,"context_line":""},{"line_number":1340,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"bde0a70b_043353af","line":1337,"updated":"2026-10-28 14:55:42.000000000","message":"I thought one of the key values we wanted to report on was the checksum-type and full/composite algorithm?","commit_id":"735bda11bb703bc8ac4dfaa49467def570544216"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"0b13a64f06e1a2980b842c9c529067994fdd4181","unresolved":false,"context_lines":[{"line_number":1334,"context_line":"        self.statsd.increment(\u0027swift_s3_complete_mpu\u0027, labels\u003d{"},{"line_number":1335,"context_line":"            \u0027outcome\u0027: outcome,"},{"line_number":1336,"context_line":"            \u0027account\u0027: base_labels.get(\u0027account\u0027, req.account),"},{"line_number":1337,"context_line":"            \u0027container\u0027: base_labels.get(\u0027container\u0027, req.container_name),"},{"line_number":1338,"context_line":"        })"},{"line_number":1339,"context_line":""},{"line_number":1340,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"0dfec66f_e4488609","line":1337,"in_reply_to":"bde0a70b_043353af","updated":"2026-10-29 04:45:06.000000000","message":"add two new labels \"checksum_algorithm\" and \"checksum_type\", now it is\n```\nswift_s3_complete_mpu{\n  account\u003d\"AUTH_test\",\n  container\u003d\"s3test\",\n  outcome\u003d\"persisted\",\n  checksum_algorithm\u003d\"CRC32\",\n  checksum_type\u003d\"FULL_OBJECT\"\n}\n```","commit_id":"735bda11bb703bc8ac4dfaa49467def570544216"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dae2bdebed5a194500706fb5c78f0225b997e5bc","unresolved":true,"context_lines":[{"line_number":1384,"context_line":"        request_checksum_attrs \u003d MPUChecksumAttrs.from_request(req)"},{"line_number":1385,"context_line":"        mpu_checksum_attrs \u003d MPUChecksumAttrs.from_sysmeta("},{"line_number":1386,"context_line":"            resp.sysmeta_headers, is_marker)"},{"line_number":1387,"context_line":"        self._complete_mpu_checksum_attrs \u003d mpu_checksum_attrs"},{"line_number":1388,"context_line":"        _validate_mpu_complete_checksum_headers("},{"line_number":1389,"context_line":"            request_checksum_attrs, mpu_checksum_attrs)"},{"line_number":1390,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1dafd72a_324be7ab","line":1387,"range":{"start_line":1387,"start_character":8,"end_line":1387,"end_character":62},"updated":"2026-11-05 11:54:05.000000000","message":"I want to understand why this *complete specific state* needs to be an instance attribute. I suspect it is because the refactor makes it awkward to plumb between calls. I like the refactor to reduce method length, but I think I\u0027d find it helpful to have that done first and then a patch to emit a stat.","commit_id":"7b0b22c6caa4d9437e7bce367b37fec89ad815fc"}],"swift/common/middleware/s3api/s3api.py":[{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"natemartes09@gmail.com","username":"nmartes"},"change_message_id":"cf88bf9362d5d058cf242e61491eae7ee2f41a44","unresolved":false,"context_lines":[{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    def handle_request(self, req):"},{"line_number":501,"context_line":"        controller \u003d req.controller("},{"line_number":502,"context_line":"            self.app, self.conf, self.logger, statsd\u003dself.statsd)"},{"line_number":503,"context_line":"        req.set_acl_handler(req.controller.acl_handler(req, self.logger))"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"        if hasattr(controller, req.method):"}],"source_content_type":"text/x-python","patch_set":1,"id":"a386b81b_e2ac0cd9","line":502,"range":{"start_line":502,"start_character":0,"end_line":502,"end_character":2},"updated":"2026-09-08 12:08:03.000000000","message":"Even though we really only need the statsd client in the CompleteMultiPartUpload phase (as of now) I think its alright to give the client to every controller","commit_id":"2fe1f306fae62e5bb250b1d55069b6e593cd9512"}],"test/unit/common/middleware/s3api/test_multi_upload.py":[{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cf85ee78ebc02e172fad8053a14eee81b79a5072","unresolved":true,"context_lines":[{"line_number":2515,"context_line":"            ({\u0027container\u0027: \u0027client-bucket\u0027}, \u0027AUTH_test\u0027, \u0027client-bucket\u0027,"},{"line_number":2516,"context_line":"             \u0027malformed_XML\u0027, \u0027400 Bad Request\u0027, \u0027invalid_request\u0027),"},{"line_number":2517,"context_line":"            ({\u0027account\u0027: None, \u0027container\u0027: None}, None, None,"},{"line_number":2518,"context_line":"             XML, \u0027200 OK\u0027, \u0027completed\u0027),"},{"line_number":2519,"context_line":"        )"},{"line_number":2520,"context_line":"        for identity, account, container, body, status, outcome in cases:"},{"line_number":2521,"context_line":"            with self.subTest(identity\u003didentity, outcome\u003doutcome):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f57825e_9ca7393f","line":2518,"updated":"2026-10-28 19:31:33.000000000","message":"nit: IIRC the base_labels in proxy_logging currently would not have the \u0027container\u0027 key if the value would be None. Although for unit tests this seems not an issue","commit_id":"735bda11bb703bc8ac4dfaa49467def570544216"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"0b13a64f06e1a2980b842c9c529067994fdd4181","unresolved":false,"context_lines":[{"line_number":2515,"context_line":"            ({\u0027container\u0027: \u0027client-bucket\u0027}, \u0027AUTH_test\u0027, \u0027client-bucket\u0027,"},{"line_number":2516,"context_line":"             \u0027malformed_XML\u0027, \u0027400 Bad Request\u0027, \u0027invalid_request\u0027),"},{"line_number":2517,"context_line":"            ({\u0027account\u0027: None, \u0027container\u0027: None}, None, None,"},{"line_number":2518,"context_line":"             XML, \u0027200 OK\u0027, \u0027completed\u0027),"},{"line_number":2519,"context_line":"        )"},{"line_number":2520,"context_line":"        for identity, account, container, body, status, outcome in cases:"},{"line_number":2521,"context_line":"            with self.subTest(identity\u003didentity, outcome\u003doutcome):"}],"source_content_type":"text/x-python","patch_set":12,"id":"57aba331_74755fde","line":2518,"in_reply_to":"5f57825e_9ca7393f","updated":"2026-10-29 04:45:06.000000000","message":"Done","commit_id":"735bda11bb703bc8ac4dfaa49467def570544216"}]}
