diff options
author | Zuul <zuul@review.opendev.org> | 2019-10-19 02:05:54 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2019-10-19 02:05:54 +0000 |
commit | 27b4f2db3c27e768a4388499ecac4f9ec8314979 (patch) | |
tree | f39bb7345da8fccf4f631bcbf0e6195efc7af368 | |
parent | 8e709a5db02cf701f6500affa1496a0510478588 (diff) | |
parent | a556c2b5f739db863c1bcb8cea2dc6c31144ff13 (diff) | |
download | swift-27b4f2db3c27e768a4388499ecac4f9ec8314979.tar.gz |
Merge "versioned_writes: checks for SLO object before copy" into stable/stein
-rw-r--r-- | swift/common/middleware/versioned_writes.py | 7 | ||||
-rw-r--r-- | test/functional/test_versioned_writes.py | 41 |
2 files changed, 47 insertions, 1 deletions
diff --git a/swift/common/middleware/versioned_writes.py b/swift/common/middleware/versioned_writes.py index 516f3f26e..d4f9b5e34 100644 --- a/swift/common/middleware/versioned_writes.py +++ b/swift/common/middleware/versioned_writes.py @@ -385,13 +385,18 @@ class VersionedWritesContext(WSGIContext): return source_resp def _put_versioned_obj(self, req, put_path_info, source_resp): - # Create a new Request object to PUT to the versions container, copying + # Create a new Request object to PUT to the container, copying # all headers from the source object apart from x-timestamp. put_req = make_pre_authed_request( req.environ, path=quote(put_path_info), method='PUT', swift_source='VW') copy_header_subset(source_resp, put_req, lambda k: k.lower() != 'x-timestamp') + slo_size = put_req.headers.get('X-Object-Sysmeta-Slo-Size') + if slo_size: + put_req.headers['Content-Type'] += '; swift_bytes=' + slo_size + put_req.environ['swift.content_type_overridden'] = True + put_req.environ['wsgi.input'] = FileLikeIter(source_resp.app_iter) put_resp = put_req.get_response(self.app) close_if_possible(source_resp.app_iter) diff --git a/test/functional/test_versioned_writes.py b/test/functional/test_versioned_writes.py index 205ba0663..0be71c315 100644 --- a/test/functional/test_versioned_writes.py +++ b/test/functional/test_versioned_writes.py @@ -1047,3 +1047,44 @@ class TestSloWithVersioning(unittest2.TestCase): # expect the original manifest file to be restored self._assert_is_manifest(file_item, 'a') self._assert_is_object(file_item, 'a') + + def test_slo_manifest_version_size(self): + file_item = self._create_manifest('a') + # sanity check: read the manifest, then the large object + self._assert_is_manifest(file_item, 'a') + self._assert_is_object(file_item, b'a') + + # original manifest size + primary_list = self.container.files(parms={'format': 'json'}) + self.assertEqual(1, len(primary_list)) + org_size = primary_list[0]['bytes'] + + # upload new manifest + file_item = self._create_manifest('b') + # sanity check: read the manifest, then the large object + self._assert_is_manifest(file_item, 'b') + self._assert_is_object(file_item, b'b') + + versions_list = self.versions_container.files(parms={'format': 'json'}) + self.assertEqual(1, len(versions_list)) + version_file = self.versions_container.file(versions_list[0]['name']) + version_file_size = versions_list[0]['bytes'] + # check the version is still a manifest + self._assert_is_manifest(version_file, 'a') + self._assert_is_object(version_file, b'a') + + # check the version size is correct + self.assertEqual(version_file_size, org_size) + + # delete the newest manifest + file_item.delete() + + # expect the original manifest file to be restored + self._assert_is_manifest(file_item, 'a') + self._assert_is_object(file_item, b'a') + + primary_list = self.container.files(parms={'format': 'json'}) + self.assertEqual(1, len(primary_list)) + primary_file_size = primary_list[0]['bytes'] + # expect the original manifest file size to be the same + self.assertEqual(primary_file_size, org_size) |