From dc2fdaf6b980c0a24aa020046dbfe1f408deb1f5 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Wed, 18 Mar 2015 22:11:03 -0700 Subject: [PATCH] Allow using shallow copy instead of deep copy Certain projects (cinder at the least) seems to be storing items that can not be deep copied without issues; so to make it so that we can easily support having this backend be the default backend always used we need to be able to support a shallow copy for when it is needed. Change-Id: I16215b44870cef9ea60d144ba710c5d730e8b284 --- taskflow/persistence/backends/impl_memory.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/taskflow/persistence/backends/impl_memory.py b/taskflow/persistence/backends/impl_memory.py index 78ef21c3..a457214a 100644 --- a/taskflow/persistence/backends/impl_memory.py +++ b/taskflow/persistence/backends/impl_memory.py @@ -38,8 +38,12 @@ class FakeFilesystem(object): " paths: '%s' is not valid" % path) return os.path.normpath(path) - def __init__(self): + def __init__(self, deep_copy=True): self._root = tree.Node(self.root_path, value=None) + if deep_copy: + self._copier = copy.deepcopy + else: + self._copier = copy.copy def ensure_path(self, path): path = self._normpath(path) @@ -83,7 +87,7 @@ class FakeFilesystem(object): links.append(path) return self._get_item(path, links=links) else: - return copy.deepcopy(node.metadata['value']) + return self._copier(node.metadata['value']) def ls(self, path): return [node.item for node in self._fetch_node(path)] @@ -131,7 +135,7 @@ class FakeFilesystem(object): def __setitem__(self, path, value): path = self._normpath(path) - value = copy.deepcopy(value) + value = self._copier(value) try: item_node = self._fetch_node(path) item_node.metadata.update(value=value) @@ -156,7 +160,8 @@ class MemoryBackend(path_based.PathBasedBackend): super(MemoryBackend, self).__init__(conf) if self._path is None: self._path = os.sep - self.memory = FakeFilesystem() + self.memory = FakeFilesystem(deep_copy=self._conf.get('deep_copy', + True)) self.lock = lock_utils.ReaderWriterLock() def get_connection(self):