)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4f72565db63118ed430c165efcc69f06d54a95d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"645b0ec2_72475a0e","updated":"2026-07-10 17:18:21.000000000","message":"I haven\u0027t entirely grokked all of the changes in object_versioning.py but seems good if CI passes.","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"}],"swift/common/middleware/s3api/controllers/bucket.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4f72565db63118ed430c165efcc69f06d54a95d","unresolved":true,"context_lines":[{"line_number":127,"context_line":"                if version_marker is not None:"},{"line_number":128,"context_line":"                    if version_marker !\u003d \u0027null\u0027:"},{"line_number":129,"context_line":"                        try:"},{"line_number":130,"context_line":"                            Timestamp(version_marker)"},{"line_number":131,"context_line":"                        except ValueError:"},{"line_number":132,"context_line":"                            raise InvalidArgument("},{"line_number":133,"context_line":"                                \u0027version-id-marker\u0027, version_marker,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ecd99ed3_6e47ce94","line":130,"updated":"2026-07-10 17:18:21.000000000","message":"Really? Why? I guess because of how much the signature changed?","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94af4cfa028e61bd216ac0cda36a436c53fcf8b3","unresolved":true,"context_lines":[{"line_number":127,"context_line":"                if version_marker is not None:"},{"line_number":128,"context_line":"                    if version_marker !\u003d \u0027null\u0027:"},{"line_number":129,"context_line":"                        try:"},{"line_number":130,"context_line":"                            Timestamp(version_marker)"},{"line_number":131,"context_line":"                        except ValueError:"},{"line_number":132,"context_line":"                            raise InvalidArgument("},{"line_number":133,"context_line":"                                \u0027version-id-marker\u0027, version_marker,"}],"source_content_type":"text/x-python","patch_set":2,"id":"c96bfc61_e28b608b","line":130,"in_reply_to":"ecd99ed3_6e47ce94","updated":"2026-07-13 11:55:24.000000000","message":"this is actually reverting back to master.\n\nOn feature/mpu validate_version had been defined to raise ValueError. On master, validate_version was introduced and raises HTTPBadRequest which we don\u0027t want here (https://review.opendev.org/c/openstack/swift/+/983192/3/swift/common/middleware/versioned_writes/object_versioning.py).","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"}],"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4f72565db63118ed430c165efcc69f06d54a95d","unresolved":false,"context_lines":[{"line_number":335,"context_line":"                    pass  # drain the bulk-deleter response"},{"line_number":336,"context_line":"                resp.status \u003d HTTP_NO_CONTENT"},{"line_number":337,"context_line":"                resp.body \u003d b\u0027\u0027"},{"line_number":338,"context_line":"            if resp.sw_headers.get(\u0027X-Object-Current-Version-Id\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":339,"context_line":"                new_resp \u003d self._restore_on_delete(req)"},{"line_number":340,"context_line":"                if new_resp:"},{"line_number":341,"context_line":"                    resp \u003d new_resp"}],"source_content_type":"text/x-python","patch_set":2,"id":"0ab0502b_030b543e","side":"PARENT","line":338,"range":{"start_line":338,"start_character":70,"end_line":338,"end_character":74},"updated":"2026-07-10 17:18:21.000000000","message":"😬","commit_id":"07f8ea0a4b2eb3aa9f07248f8f4d96c924068d00"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94af4cfa028e61bd216ac0cda36a436c53fcf8b3","unresolved":false,"context_lines":[{"line_number":335,"context_line":"                    pass  # drain the bulk-deleter response"},{"line_number":336,"context_line":"                resp.status \u003d HTTP_NO_CONTENT"},{"line_number":337,"context_line":"                resp.body \u003d b\u0027\u0027"},{"line_number":338,"context_line":"            if resp.sw_headers.get(\u0027X-Object-Current-Version-Id\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":339,"context_line":"                new_resp \u003d self._restore_on_delete(req)"},{"line_number":340,"context_line":"                if new_resp:"},{"line_number":341,"context_line":"                    resp \u003d new_resp"}],"source_content_type":"text/x-python","patch_set":2,"id":"de24c8b9_8d93c2c1","side":"PARENT","line":338,"range":{"start_line":338,"start_character":70,"end_line":338,"end_character":74},"in_reply_to":"0ab0502b_030b543e","updated":"2026-07-13 11:55:24.000000000","message":"turns out \u0027none\u0027 was correct for the s3-compat versioning changes on feature/mpu","commit_id":"07f8ea0a4b2eb3aa9f07248f8f4d96c924068d00"}],"swift/common/middleware/versioned_writes/object_versioning.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4f72565db63118ed430c165efcc69f06d54a95d","unresolved":true,"context_lines":[{"line_number":259,"context_line":"    Validate a version."},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    :param version: version string to validate"},{"line_number":262,"context_line":"    :raises ValueError: if the version is invalid"},{"line_number":263,"context_line":"    \"\"\""},{"line_number":264,"context_line":"    if version !\u003d \u0027null\u0027 or not allow_null:"},{"line_number":265,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fd03a126_da2d3266","line":262,"updated":"2026-07-10 17:18:21.000000000","message":"Oh, this should get updated...","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4f72565db63118ed430c165efcc69f06d54a95d","unresolved":true,"context_lines":[{"line_number":380,"context_line":"                resp.headers.get("},{"line_number":381,"context_line":"                    \u0027x-timestamp\u0027,"},{"line_number":382,"context_line":"                    str(parse_date_header(resp.headers[\u0027last-modified\u0027])))))"},{"line_number":383,"context_line":"        return timestamp_to_version(Timestamp(timestamp_str))"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def _get_source_object(self, req, path_info):"},{"line_number":386,"context_line":"        # make a pre_auth request in case the user has write access"},{"line_number":387,"context_line":"        # to container, but not READ. This was allowed in previous version"}],"source_content_type":"text/x-python","patch_set":2,"id":"36770381_47e2a183","line":384,"range":{"start_line":383,"start_character":15,"end_line":384,"end_character":1},"updated":"2026-07-10 17:18:21.000000000","message":"nit: Could simplify to `timestamp_to_version(timestamp_str)`","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94af4cfa028e61bd216ac0cda36a436c53fcf8b3","unresolved":false,"context_lines":[{"line_number":380,"context_line":"                resp.headers.get("},{"line_number":381,"context_line":"                    \u0027x-timestamp\u0027,"},{"line_number":382,"context_line":"                    str(parse_date_header(resp.headers[\u0027last-modified\u0027])))))"},{"line_number":383,"context_line":"        return timestamp_to_version(Timestamp(timestamp_str))"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def _get_source_object(self, req, path_info):"},{"line_number":386,"context_line":"        # make a pre_auth request in case the user has write access"},{"line_number":387,"context_line":"        # to container, but not READ. This was allowed in previous version"}],"source_content_type":"text/x-python","patch_set":2,"id":"ea9a4543_1049221d","line":384,"range":{"start_line":383,"start_character":15,"end_line":384,"end_character":1},"in_reply_to":"36770381_47e2a183","updated":"2026-07-13 11:55:24.000000000","message":"Done","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fe0a4df2fcb2b3f627d899a76afb4b9335d78d0e","unresolved":true,"context_lines":[{"line_number":799,"context_line":"        \"\"\""},{"line_number":800,"context_line":"        # The intended use case for a PUT?version-id\u003d is to create a symlink to"},{"line_number":801,"context_line":"        # a version in the versions container."},{"line_number":802,"context_line":"        validate_version(req, version, allow_null\u003dTrue)"},{"line_number":803,"context_line":"        if req.is_chunked:"},{"line_number":804,"context_line":"            has_body \u003d (req.body_file.read(1) !\u003d b\u0027\u0027)"},{"line_number":805,"context_line":"        elif req.content_length is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9b50f759_4d226223","line":802,"updated":"2026-07-15 09:02:04.000000000","message":"Is this intentional - changing from ```allow_null\u003dFalse``` to ```allow_null\u003dTrue``` in the merge request?","commit_id":"5055839cdc614ddbec5afc063a7577d77635ba3e"}],"test/functional/test_object_versioning.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b1db35ca9f1723fa9826a244d2d5bd80934ed9ff","unresolved":true,"context_lines":[{"line_number":1092,"context_line":"            obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u0027null\u0027})"},{"line_number":1093,"context_line":"        self.assertEqual(400, cm.exception.status)"},{"line_number":1094,"context_line":""},{"line_number":1095,"context_line":"        with self.assertRaises(ResponseError) as cm:"},{"line_number":1096,"context_line":"            obj.write(b\u0027\u0027, parms\u003d{\u0027version-id\u0027: \u0027bad\u0027})"},{"line_number":1097,"context_line":"        self.assertEqual(400, cm.exception.status)"},{"line_number":1098,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"0b90e18c_96e986bf","line":1095,"updated":"2026-07-15 10:18:05.000000000","message":"fails because s3-compat versioning does support \u0027null\u0027 version id","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"}],"test/probe/common.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d4f72565db63118ed430c165efcc69f06d54a95d","unresolved":true,"context_lines":[{"line_number":531,"context_line":"        finally:"},{"line_number":532,"context_line":"            shutil.rmtree(tempdir)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    def make_internal_client(self, conf\u003dNone):"},{"line_number":535,"context_line":"        if conf:"},{"line_number":536,"context_line":"            return self.make_custom_internal_client(conf)"},{"line_number":537,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"22b89581_f8ccd832","line":534,"updated":"2026-07-10 17:18:21.000000000","message":"I wonder if we could leave them as\n```\ndef make_custom_internal_client(self, conf):\n    ...\ndef make_internal_client(self):\n    ...\n```\nI.e. if you want a custom IC, call `make_custom_internal_client` and if not, call `make_internal_client`","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"94af4cfa028e61bd216ac0cda36a436c53fcf8b3","unresolved":false,"context_lines":[{"line_number":531,"context_line":"        finally:"},{"line_number":532,"context_line":"            shutil.rmtree(tempdir)"},{"line_number":533,"context_line":""},{"line_number":534,"context_line":"    def make_internal_client(self, conf\u003dNone):"},{"line_number":535,"context_line":"        if conf:"},{"line_number":536,"context_line":"            return self.make_custom_internal_client(conf)"},{"line_number":537,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d360cef_8cb138e9","line":534,"in_reply_to":"22b89581_f8ccd832","updated":"2026-07-13 11:55:24.000000000","message":"Done","commit_id":"406188621d2b792636ecf9408d7d0cd1e7a98e5a"}],"test/probe/test_mpu.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b1db35ca9f1723fa9826a244d2d5bd80934ed9ff","unresolved":true,"context_lines":[{"line_number":359,"context_line":"        print(\u0027internal client pipeline: %s\u0027"},{"line_number":360,"context_line":"              % conf[\u0027pipeline:main\u0027][\u0027pipeline\u0027])"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        return self.make_custom_internal_client(conf\u003dconf)"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def post_object(self, container, obj, headers\u003dNone, query_string\u003d\u0027\u0027,"},{"line_number":365,"context_line":"                    body\u003db\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"e29201e4_a6bebacb","line":362,"updated":"2026-07-15 10:18:05.000000000","message":"changes needed because on master the default internal-client conf was removed","commit_id":"a991fdf18b15af3835ccc8abcfce2bd8cb862ffe"}]}
