)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ef80d5b2e3352ca206a7abca389d98433d624e01","unresolved":true,"context_lines":[{"line_number":22,"context_line":"NoSuchBucket). With this patch the object_versioning middleware will"},{"line_number":23,"context_line":"return a \u0027412 PreconditionFailed\u0027 status (which the s3api middleware"},{"line_number":24,"context_line":"catches and ignores). However, the PUT?version-id\u003d request form is not"},{"line_number":25,"context_line":"documented as being supported by the object_versioning API for clients."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Closes-Bug: #2158890"},{"line_number":28,"context_line":"Related-Change: Ied8851c2a6586ca07897f0d4cd4926be7d9e4e1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"e838f34b_1646c0ed","line":25,"updated":"2026-07-01 14:05:14.000000000","message":"an alternative approach would be to have the restore_on_delete catch and ignore *any* 4xx response, and leave the object_versioning behaviour unchanged","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9be1da238d3fbdc6b8efc3a99e601e1c2c855860","unresolved":false,"context_lines":[{"line_number":22,"context_line":"NoSuchBucket). With this patch the object_versioning middleware will"},{"line_number":23,"context_line":"return a \u0027412 PreconditionFailed\u0027 status (which the s3api middleware"},{"line_number":24,"context_line":"catches and ignores). However, the PUT?version-id\u003d request form is not"},{"line_number":25,"context_line":"documented as being supported by the object_versioning API for clients."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Closes-Bug: #2158890"},{"line_number":28,"context_line":"Related-Change: Ied8851c2a6586ca07897f0d4cd4926be7d9e4e1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"e8f66d93_b647a863","line":25,"in_reply_to":"d4798c7f_8e3a8dcc","updated":"2026-07-17 10:01:16.000000000","message":"Acknowledged","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e438b5462326b5be06fead0051ec8cdfd7ebe351","unresolved":true,"context_lines":[{"line_number":22,"context_line":"NoSuchBucket). With this patch the object_versioning middleware will"},{"line_number":23,"context_line":"return a \u0027412 PreconditionFailed\u0027 status (which the s3api middleware"},{"line_number":24,"context_line":"catches and ignores). However, the PUT?version-id\u003d request form is not"},{"line_number":25,"context_line":"documented as being supported by the object_versioning API for clients."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Closes-Bug: #2158890"},{"line_number":28,"context_line":"Related-Change: Ied8851c2a6586ca07897f0d4cd4926be7d9e4e1b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"d4798c7f_8e3a8dcc","line":25,"in_reply_to":"e838f34b_1646c0ed","updated":"2026-07-01 14:20:10.000000000","message":"Ah, yes, I see less disadvantages with that approach - mainly we don\u0027t have to consider the righteousness of changing an undocumented public swift API return code","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3f67906d46426df1b64dc5d43c750729967f9657","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e40f5dd0_ee6f1ce4","updated":"2026-06-30 17:33:07.000000000","message":"needs a launchpad bug","commit_id":"d82f71673dbefb3f99170bc5e0ccf4f4bc513eee"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e438b5462326b5be06fead0051ec8cdfd7ebe351","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"fbdba5a6_3afaf3c1","updated":"2026-07-01 14:20:10.000000000","message":"I wonder if it\u0027s possible the 412 handling was trying to say something about if-match headers that the client manged to sneak into their DELETE request?\n\nFWIW I think the 404 behavior from the swift-api is slightly easier to justify than additional [ab]use of 412.  Maybe a generic 400 would have also been fine, but I think the strongest case argues that we shouldn\u0027t change it.\n\nN.B. for s3api we never get to argue \"but swift always did this\" when changing API responses - s3api can be \"wrong\" for a long time, but once someone notices we don\u0027t match AWS S3 we can always \"fix\" it.","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a0fb7b00aac9236b5331bb5a0f61f84dc7e1791f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"6fc9384f_cf6fdb3d","updated":"2026-07-01 12:38:16.000000000","message":"recheck\n\nlooks like probe tests failed to restart servers in a timely way, unrelated","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"993a2f5e1f5653266745f9bdb3fa815c02921f90","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0f1a3c79_df541ec3","in_reply_to":"fbdba5a6_3afaf3c1","updated":"2026-07-01 14:33:28.000000000","message":"seems like we both have the same question/hesitation about the object_versioning API change.\n\nWhat biased my choice was that object_versioning seems to want to translate \"subrequest\" 404s to 412 https://github.com/openstack/swift/blob/9efebcc6a16f200328b486335efdbd442206dadf/swift/common/middleware/versioned_writes/object_versioning.py#L399-L414\n(except sometimes the 404 is handled before the resp reaches ``_check_response_error`` )...I don\u0027t really know whether the original *intent* was for object_versioning to (ab)use 412 when a referenced version cannot be found (or whatever) and the 404 is a bug, or whether the 412 usage is more subtle.\n\nI\u0027ll WIP this for now and look at changing the s3api handler instead.","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2b68f0dddd19a59f05d31fa2f27489aa1cce62c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b22901e5_6caa3e98","updated":"2026-07-18 01:47:46.000000000","message":"tests look really solid - implementation deserves the comment because to reset expectations with the ambiguous NoSuchBucket \"response\" but I think that\u0027s the ideal for this change.","commit_id":"e11c302aec5962e5340851eff9ffc9eb007b9c79"}],"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2b68f0dddd19a59f05d31fa2f27489aa1cce62c1","unresolved":true,"context_lines":[{"line_number":216,"context_line":"                # source object for the restored version cannot be found (e.g."},{"line_number":217,"context_line":"                # if the versions listing is stale), but S3Request maps a 404"},{"line_number":218,"context_line":"                # for a PUT to NoSuchBucket, so we catch that here to avoid it"},{"line_number":219,"context_line":"                # propagating to the client."},{"line_number":220,"context_line":"                self.logger.debug(\u0027skipping failed PUT?version-id\u003d%s\u0027,"},{"line_number":221,"context_line":"                                  item[\u0027version_id\u0027])"},{"line_number":222,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":6,"id":"6d29c168_102c5291","line":219,"updated":"2026-07-18 01:47:46.000000000","message":"IMHO this comment is unfortunately the correct compromise given the eixsting limitiations of the error routing translation:\n\n997805: refactor s3api swift error mapping | https://review.opendev.org/c/openstack/swift/+/997805","commit_id":"e11c302aec5962e5340851eff9ffc9eb007b9c79"}],"test/functional/test_object_versioning.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e438b5462326b5be06fead0051ec8cdfd7ebe351","unresolved":true,"context_lines":[{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"        with self.assertRaises(ResponseError) as cm:"},{"line_number":1082,"context_line":"            obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u00271234567890.12345\u0027})"},{"line_number":1083,"context_line":"        self.assertEqual(412, cm.exception.status)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def test_put_with_invalid_version_id(self):"},{"line_number":1086,"context_line":"        versioned_obj_name \u003d Utils.create_name()"}],"source_content_type":"text/x-python","patch_set":4,"id":"b9c66959_a44cd5d6","line":1083,"updated":"2026-07-01 14:20:10.000000000","message":"not that I have a lot of reverence for the swift api - but this seems like it is suggesting we think it\u0027s ok to change this client expectation","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9be1da238d3fbdc6b8efc3a99e601e1c2c855860","unresolved":false,"context_lines":[{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"        with self.assertRaises(ResponseError) as cm:"},{"line_number":1082,"context_line":"            obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u00271234567890.12345\u0027})"},{"line_number":1083,"context_line":"        self.assertEqual(412, cm.exception.status)"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    def test_put_with_invalid_version_id(self):"},{"line_number":1086,"context_line":"        versioned_obj_name \u003d Utils.create_name()"}],"source_content_type":"text/x-python","patch_set":4,"id":"635fbeb0_90c7d2d3","line":1083,"in_reply_to":"b9c66959_a44cd5d6","updated":"2026-07-17 10:01:16.000000000","message":"Acknowledged","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e438b5462326b5be06fead0051ec8cdfd7ebe351","unresolved":true,"context_lines":[{"line_number":1751,"context_line":"                            json.dumps(old_versions))"},{"line_number":1752,"context_line":"        self.swift.register(\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027"},{"line_number":1753,"context_line":"                            \u0027?version-id\u003d1574341899.21751\u0027,"},{"line_number":1754,"context_line":"                            swob.HTTPPreconditionFailed, {}, None)"},{"line_number":1755,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?versionId\u003d1574358170.12293\u0027,"},{"line_number":1756,"context_line":"                            method\u003d\u0027DELETE\u0027, headers\u003d{"},{"line_number":1757,"context_line":"                                \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"45e29479_cb9212f9","line":1754,"updated":"2026-07-01 14:20:10.000000000","message":"I\u0027m not sure I trust that s3api authoratative on the correct status code or behavior for the restore on DELETE case:\n\nhttps://github.com/NVIDIA/swift/blob/master/swift/common/middleware/s3api/controllers/obj.py#L208\n\nthat loop reads like \"if this doesn\u0027t work for some reason: just ignore and try the next one\" - which is sort of sus","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9be1da238d3fbdc6b8efc3a99e601e1c2c855860","unresolved":false,"context_lines":[{"line_number":1751,"context_line":"                            json.dumps(old_versions))"},{"line_number":1752,"context_line":"        self.swift.register(\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027"},{"line_number":1753,"context_line":"                            \u0027?version-id\u003d1574341899.21751\u0027,"},{"line_number":1754,"context_line":"                            swob.HTTPPreconditionFailed, {}, None)"},{"line_number":1755,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?versionId\u003d1574358170.12293\u0027,"},{"line_number":1756,"context_line":"                            method\u003d\u0027DELETE\u0027, headers\u003d{"},{"line_number":1757,"context_line":"                                \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"32ae0806_7d966b11","line":1754,"in_reply_to":"45e29479_cb9212f9","updated":"2026-07-17 10:01:16.000000000","message":"Acknowledged","commit_id":"140e0cff31857e824415bf5abeacb3d3c9a395e1"}]}
