)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b40fc0a6008033f76d82ef1d30d22f2031cfb923","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cf8b4c28_8d6be4b7","updated":"2022-08-02 10:42:32.000000000","message":"nice fix","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"b36133ae9262323c8196e1d8a834d28fdf4fc713","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ae180ab3_32cdd7da","updated":"2022-08-01 21:37:40.000000000","message":"verified by func test on cloud qa environment, with this MR, retry MPU completion now has same log format as normal completion\n\nAug 01 21:31:59 ip-192-168-18-133 proxy-server[20665]: 192.168.16.126 192.168.16.126 01/Aug/2022/21/31/59 POST /bucket/obj1%25E2%2598%2583%3FuploadId%3DMDAwOTJkYjEtZTlmNS00ZmQzLTkwZjAtYTRiZjEyNjcxNGRl HTTP/1.0 200 - Boto/2.45.0%20Python/2.7.5%20Linux/3.10.0-1160.59.1.el7.x86_64 - 224 308 - tx57de3a2fe79c4484bda3d-0062e8464f - 0.0801 - - 1659389519.725929022 1659389519.806025982 0 - AUTH_jhuo bucket%2Bsegments obj1%E2%98%83/MDAwOTJkYjEtZTlmNS00ZmQzLTkwZjAtYTRiZjEyNjcxNGRl 200","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"361556774d6541434a4a37d896d4b715f4b9d172","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6fcca0d9_752aa5df","updated":"2022-08-05 19:18:12.000000000","message":"Good catch!","commit_id":"f488bb352c38ca95427745106400d03510081dae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"17fdb747a8d484c0e990ce4b17e8ff4139d10f39","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"adabdc37_ddf84aae","updated":"2022-08-03 08:42:01.000000000","message":"looks good except a minor issue with the test comment (which could confuse future us)","commit_id":"f488bb352c38ca95427745106400d03510081dae"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b40fc0a6008033f76d82ef1d30d22f2031cfb923","unresolved":true,"context_lines":[{"line_number":110,"context_line":"        return req.get_response(app, \u0027HEAD\u0027, container\u003dcontainer, obj\u003dobj)"},{"line_number":111,"context_line":"    except NoSuchKey:"},{"line_number":112,"context_line":"        try:"},{"line_number":113,"context_line":"            marker_path \u003d req.environ[\u0027s3api.backend_path\u0027]"},{"line_number":114,"context_line":"            resp \u003d req.get_response(app, \u0027HEAD\u0027)"},{"line_number":115,"context_line":"            # Ops often find it more useful for us to log the upload marker"},{"line_number":116,"context_line":"            # path, so put it back"}],"source_content_type":"text/x-python","patch_set":1,"id":"888c89ad_2765289c","line":113,"updated":"2022-08-02 10:42:32.000000000","message":"It took me a while to convince myself that the \u0027s3api.backend_path\u0027 key would always be in the environ.\n\nIn s3request.py, at first glance, it looks like s3api.backend_path is only set for a successful response [1], and here we\u0027re dealing with a 404 (NoSuchKey). But in fact a 404 is not *raised* as a swob.HTTPException, but returned from the call to sw_req.get_response(app), so we do drop into the else clause [1] and set s3api.backend_path !\n\nI still wonder if it might be defensive to check if \u0027s3api.backend_path\u0027 in req.environ\n\n[1] https://github.com/openstack/swift/blob/6af4449268533af57063d5be6e83d7d17c6706b2/swift/common/middleware/s3api/s3request.py#L1350-L1365","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7cab30a4145f1f481e280897202b8940bbcb1788","unresolved":true,"context_lines":[{"line_number":110,"context_line":"        return req.get_response(app, \u0027HEAD\u0027, container\u003dcontainer, obj\u003dobj)"},{"line_number":111,"context_line":"    except NoSuchKey:"},{"line_number":112,"context_line":"        try:"},{"line_number":113,"context_line":"            marker_path \u003d req.environ[\u0027s3api.backend_path\u0027]"},{"line_number":114,"context_line":"            resp \u003d req.get_response(app, \u0027HEAD\u0027)"},{"line_number":115,"context_line":"            # Ops often find it more useful for us to log the upload marker"},{"line_number":116,"context_line":"            # path, so put it back"}],"source_content_type":"text/x-python","patch_set":1,"id":"21e493d8_4e95a801","line":113,"in_reply_to":"888c89ad_2765289c","updated":"2022-08-03 00:33:33.000000000","message":"Yeah, being more defensive seems reasonable.","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b40fc0a6008033f76d82ef1d30d22f2031cfb923","unresolved":true,"context_lines":[{"line_number":114,"context_line":"            resp \u003d req.get_response(app, \u0027HEAD\u0027)"},{"line_number":115,"context_line":"            # Ops often find it more useful for us to log the upload marker"},{"line_number":116,"context_line":"            # path, so put it back"},{"line_number":117,"context_line":"            req.environ[\u0027s3api.backend_path\u0027] \u003d marker_path"},{"line_number":118,"context_line":"            if resp.sysmeta_headers.get(sysmeta_header("},{"line_number":119,"context_line":"                    \u0027object\u0027, \u0027upload-id\u0027)) \u003d\u003d upload_id:"},{"line_number":120,"context_line":"                return resp"}],"source_content_type":"text/x-python","patch_set":1,"id":"345a810a_6274eabf","line":117,"range":{"start_line":117,"start_character":48,"end_line":117,"end_character":59},"updated":"2022-08-02 10:42:32.000000000","message":"nit: Given that \u0027marker\u0027 is also used in a different context in this file, and the naming of upload_id related vars is already varied, could we include \u0027upload\u0027 in the var name here to be clear? maybe upload_marker_path","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7cab30a4145f1f481e280897202b8940bbcb1788","unresolved":true,"context_lines":[{"line_number":114,"context_line":"            resp \u003d req.get_response(app, \u0027HEAD\u0027)"},{"line_number":115,"context_line":"            # Ops often find it more useful for us to log the upload marker"},{"line_number":116,"context_line":"            # path, so put it back"},{"line_number":117,"context_line":"            req.environ[\u0027s3api.backend_path\u0027] \u003d marker_path"},{"line_number":118,"context_line":"            if resp.sysmeta_headers.get(sysmeta_header("},{"line_number":119,"context_line":"                    \u0027object\u0027, \u0027upload-id\u0027)) \u003d\u003d upload_id:"},{"line_number":120,"context_line":"                return resp"}],"source_content_type":"text/x-python","patch_set":1,"id":"643b85aa_51dbe155","line":117,"range":{"start_line":117,"start_character":48,"end_line":117,"end_character":59},"in_reply_to":"345a810a_6274eabf","updated":"2022-08-03 00:33:33.000000000","message":"Done.\n\nI also realized this should probably go in a finally clause, so we fix up logging when we raise NoSuchUpload below.","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"}],"test/unit/common/middleware/s3api/test_multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b40fc0a6008033f76d82ef1d30d22f2031cfb923","unresolved":true,"context_lines":[{"line_number":1211,"context_line":"            (\u0027DELETE\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027)"},{"line_number":1212,"context_line":"        ])"},{"line_number":1213,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":1214,"context_line":"                         \u0027/v1/AUTH_test/bucket+segments/object/X\u0027)"},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"        _, _, headers \u003d self.swift.calls_with_headers[-2]"},{"line_number":1217,"context_line":"        self.assertEqual(headers.get(\u0027X-Object-Meta-Foo\u0027), \u0027bar\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ce788278_65a2d59d","line":1214,"updated":"2022-08-02 10:42:32.000000000","message":"ok, fails if I revert change","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b40fc0a6008033f76d82ef1d30d22f2031cfb923","unresolved":true,"context_lines":[{"line_number":1256,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":1257,"context_line":"        ])"},{"line_number":1258,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":1259,"context_line":"                         \u0027/v1/AUTH_test/bucket+segments/object/X\u0027)"},{"line_number":1260,"context_line":""},{"line_number":1261,"context_line":"    def test_object_multipart_upload_invalid_md5(self):"},{"line_number":1262,"context_line":"        bad_md5 \u003d base64.b64encode(md5("}],"source_content_type":"text/x-python","patch_set":1,"id":"6b7f737a_8c9c9424","line":1259,"updated":"2022-08-02 10:42:32.000000000","message":"ok, fails if I revert change","commit_id":"b14a875deab3a8ae30ecb6f070620f1a66e8a8c4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"17fdb747a8d484c0e990ce4b17e8ff4139d10f39","unresolved":true,"context_lines":[{"line_number":1282,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027),"},{"line_number":1283,"context_line":"            # Upload marker does not exist"},{"line_number":1284,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027),"},{"line_number":1285,"context_line":"            # But the object does, and with the same upload ID"},{"line_number":1286,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":1287,"context_line":"        ])"},{"line_number":1288,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"b6e8f397_f15f8eb2","line":1285,"range":{"start_line":1285,"start_character":29,"end_line":1285,"end_character":33},"updated":"2022-08-03 08:42:01.000000000","message":"s/does/does not/","commit_id":"f488bb352c38ca95427745106400d03510081dae"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"361556774d6541434a4a37d896d4b715f4b9d172","unresolved":false,"context_lines":[{"line_number":1282,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027),"},{"line_number":1283,"context_line":"            # Upload marker does not exist"},{"line_number":1284,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027),"},{"line_number":1285,"context_line":"            # But the object does, and with the same upload ID"},{"line_number":1286,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":1287,"context_line":"        ])"},{"line_number":1288,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"e60d043f_ab079fa9","line":1285,"range":{"start_line":1285,"start_character":29,"end_line":1285,"end_character":33},"in_reply_to":"b6e8f397_f15f8eb2","updated":"2022-08-05 19:18:12.000000000","message":"Done","commit_id":"f488bb352c38ca95427745106400d03510081dae"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"17fdb747a8d484c0e990ce4b17e8ff4139d10f39","unresolved":true,"context_lines":[{"line_number":1286,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":1287,"context_line":"        ])"},{"line_number":1288,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":1289,"context_line":"                         \u0027/v1/AUTH_test/bucket+segments/object/X\u0027)"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    def test_object_multipart_upload_invalid_md5(self):"},{"line_number":1292,"context_line":"        bad_md5 \u003d base64.b64encode(md5("}],"source_content_type":"text/x-python","patch_set":2,"id":"78ea262c_bf1971a1","line":1289,"updated":"2022-08-03 08:42:01.000000000","message":"ok, this verifies that we drop into the finally clause","commit_id":"f488bb352c38ca95427745106400d03510081dae"}]}
