summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-10-19 02:05:54 +0000
committerGerrit Code Review <review@openstack.org>2019-10-19 02:05:54 +0000
commit27b4f2db3c27e768a4388499ecac4f9ec8314979 (patch)
treef39bb7345da8fccf4f631bcbf0e6195efc7af368
parent8e709a5db02cf701f6500affa1496a0510478588 (diff)
parenta556c2b5f739db863c1bcb8cea2dc6c31144ff13 (diff)
downloadswift-27b4f2db3c27e768a4388499ecac4f9ec8314979.tar.gz
Merge "versioned_writes: checks for SLO object before copy" into stable/stein
-rw-r--r--swift/common/middleware/versioned_writes.py7
-rw-r--r--test/functional/test_versioned_writes.py41
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)