)]}'
{"/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"}],"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"}],"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"}]}
