Merge "versioned_writes: checks for SLO object before copy"

This commit is contained in:
Zuul 2019-09-18 21:10:55 +00:00 committed by Gerrit Code Review
commit 28f292f290
2 changed files with 47 additions and 1 deletions

View File

@ -383,13 +383,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=wsgi_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)

View File

@ -1064,3 +1064,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, b'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)