def __init__(self, parent=None):
self.parent = parent
self._committed = False
+ self._has_remote_blocks = False
self._callback = None
self._items = {}
def stream_name(self):
raise NotImplementedError()
+ @synchronized
+ def has_remote_blocks(self):
+ """Recursively check for a +R segment locator signature."""
+
+ for item in self:
+ if self[item].has_remote_blocks():
+ return True
+ return False
+
@must_be_writable
@synchronized
def find_or_create(self, path, create_type):
source_obj, target_dir, target_name = self._get_src_target(source, target_path, source_collection, True)
target_dir.add(source_obj, target_name, overwrite, False)
+ if not self._has_remote_blocks and source_obj.has_remote_blocks():
+ self._has_remote_blocks = True
@must_be_writable
@synchronized
if not source_obj.writable():
raise IOError(errno.EROFS, "Source collection is read only", source)
target_dir.add(source_obj, target_name, overwrite, True)
+ if not self._has_remote_blocks and source_obj.has_remote_blocks():
+ self._has_remote_blocks = True
def portable_manifest_text(self, stream_name="."):
"""Get the manifest text for this collection, sub collections and files.
self._manifest_locator = manifest_locator_or_text
elif re.match(arvados.util.collection_uuid_pattern, manifest_locator_or_text):
self._manifest_locator = manifest_locator_or_text
+ if not self._has_local_collection_uuid():
+ self._has_remote_blocks = True
elif re.match(arvados.util.manifest_pattern, manifest_locator_or_text):
self._manifest_text = manifest_locator_or_text
+ if '+R' in self._manifest_text:
+ self._has_remote_blocks = True
else:
raise errors.ArgumentError(
"Argument to CollectionReader is not a manifest or a collection UUID")
t = trash_at.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
body["trash_at"] = t
- # Copy any remote blocks to the local cluster.
- self._copy_remote_blocks(remote_blocks={})
-
if not self.committed():
+ if self._has_remote_blocks:
+ # Copy any remote blocks to the local cluster.
+ self._copy_remote_blocks(remote_blocks={})
+ self._has_remote_blocks = False
if not self._has_collection_uuid():
raise AssertionError("Collection manifest_locator is not a collection uuid. Use save_new() for new collections.")
elif not self._has_local_collection_uuid():
if trash_at and type(trash_at) is not datetime.datetime:
raise errors.ArgumentError("trash_at must be datetime type.")
- # Copy any remote blocks to the local cluster.
- self._copy_remote_blocks(remote_blocks={})
+ if self._has_remote_blocks:
+ # Copy any remote blocks to the local cluster.
+ self._copy_remote_blocks(remote_blocks={})
+ self._has_remote_blocks = False
self._my_block_manager().commit_all()
text = self.manifest_text(strip=False)
c = Collection(". " + remote_block_loc + " 0:3:foofile.txt\n")
self.assertEqual(
len(re.findall(self.remote_locator_re, c.manifest_text())), 1)
+ self.assertEqual(
+ len(re.findall(self.local_locator_re, c.manifest_text())), 0)
c.save_new()
rs_mock.assert_called()
+ self.assertEqual(
+ len(re.findall(self.remote_locator_re, c.manifest_text())), 0)
self.assertEqual(
len(re.findall(self.local_locator_re, c.manifest_text())), 1)
len(re.findall(self.remote_locator_re, local_c.manifest_text())), 0)
# Copy remote file to local collection
local_c.copy('./foofile.txt', './copied/foofile.txt', remote_c)
+ self.assertEqual(
+ len(re.findall(self.local_locator_re, local_c.manifest_text())), 1)
self.assertEqual(
len(re.findall(self.remote_locator_re, local_c.manifest_text())), 1)
# Save local collection: remote block should be copied
local_c.save()
+ rs_mock.assert_called()
self.assertEqual(
len(re.findall(self.local_locator_re, local_c.manifest_text())), 2)
self.assertEqual(