Skip to content

Instantly share code, notes, and snippets.

@bloodeagle40234
Last active June 28, 2016 01:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bloodeagle40234/1badfff746df1db00fbac95e7e351b68 to your computer and use it in GitHub Desktop.
Save bloodeagle40234/1badfff746df1db00fbac95e7e351b68 to your computer and use it in GitHub Desktop.
diff --git a/swift/obj/mem_diskfile.py b/swift/obj/mem_diskfile.py
index a3b37f4..4456fa3 100644
--- a/swift/obj/mem_diskfile.py
+++ b/swift/obj/mem_diskfile.py
@@ -27,8 +27,7 @@ from swift.common.exceptions import DiskFileQuarantined, DiskFileNotExist, \
DiskFileCollision, DiskFileDeleted, DiskFileNotOpen
from swift.common.request_helpers import is_sys_meta
from swift.common.swob import multi_range_iterator
-from swift.obj.diskfile import DATAFILE_SYSTEM_META
-
+from swift.obj.diskfile import DATAFILE_SYSTEM_META, RESERVED_DATAFILE_META
class InMemoryFileSystem(object):
"""
@@ -433,7 +432,8 @@ class DiskFile(object):
# with the object data.
immutable_metadata = dict(
[(key, val) for key, val in cur_mdata.items()
- if key.lower() in DATAFILE_SYSTEM_META
+ if key.lower() in (RESERVED_DATAFILE_META |
+ DATAFILE_SYSTEM_META)
or is_sys_meta('object', key)])
metadata.update(immutable_metadata)
metadata['name'] = self._name
diff --git a/test/unit/obj/test_diskfile.py b/test/unit/obj/test_diskfile.py
index 2a18478..2b1c43f 100644
--- a/test/unit/obj/test_diskfile.py
+++ b/test/unit/obj/test_diskfile.py
@@ -2412,6 +2412,23 @@ class DiskFileMixin(BaseDiskFileTestMixin):
# original sysmeta keys are preserved
self.assertEqual('Value1', df._metadata['X-Object-Sysmeta-Key1'])
+ def test_disk_file_preserves_slo(self):
+ # build an object with some meta (at t0)
+ orig_metadata = {'X-Static-Large-Object': 'True',
+ 'Content-Type': 'text/garbage'}
+ df = self._get_open_disk_file(ts=self.ts().internal,
+ extra_metadata=orig_metadata)
+ with df.open():
+ self.assertEqual('1024', df._metadata['Content-Length'])
+ # write some new metadata (fast POST, don't send orig meta, at t0+1s)
+ df = self._simple_get_diskfile()
+ df.write_metadata({'X-Timestamp': self.ts().internal})
+ df = self._simple_get_diskfile()
+ with df.open():
+ # non-fast-post updateable keys are preserved
+ self.assertEqual('text/garbage', df._metadata['Content-Type'])
+ self.assertEqual('True', df._metadata['X-Static-Large-Object'])
+
def test_disk_file_reader_iter(self):
df = self._create_test_file('1234567890')
quarantine_msgs = []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment