[ARVADOS] updated: a04932c206425f4eb2f46e36f0acf4b7b194b865
git at public.curoverse.com
git at public.curoverse.com
Thu May 14 14:39:08 EDT 2015
Summary of changes:
services/fuse/arvados_fuse/__init__.py | 7 ++---
services/fuse/arvados_fuse/fusedir.py | 51 ++++++++++++++++++++++++++++------
services/fuse/arvados_fuse/fusefile.py | 11 ++++++--
services/fuse/tests/test_mount.py | 35 +++++++++++++++++++++++
4 files changed, 89 insertions(+), 15 deletions(-)
via a04932c206425f4eb2f46e36f0acf4b7b194b865 (commit)
via 32f8850d66e388fe0c086f8e1e4c74658c34fad0 (commit)
from ae85b0b33bcae6e36dcfa66d2fca9c70583c54b6 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit a04932c206425f4eb2f46e36f0acf4b7b194b865
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date: Thu May 14 14:43:02 2015 -0400
3198: Renaming collections in projects works. Improved conformance to POSIX semantics as best we can.
diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py
index 2b51b58..0d5ecb4 100644
--- a/services/fuse/arvados_fuse/__init__.py
+++ b/services/fuse/arvados_fuse/__init__.py
@@ -47,8 +47,7 @@ class Handle(object):
self.obj.dec_use()
def flush(self):
- with llfuse.lock_released:
- return self.obj.flush()
+ return self.obj.flush()
class FileHandle(Handle):
@@ -244,12 +243,12 @@ class Operations(llfuse.Operations):
if 'event_type' in ev:
with llfuse.lock:
item = self.inodes.inode_cache.find(ev["object_uuid"])
- if item:
+ if item is not None:
item.invalidate()
item.update()
itemparent = self.inodes.inode_cache.find(ev["object_owner_uuid"])
- if itemparent:
+ if itemparent is not None:
itemparent.invalidate()
itemparent.update()
diff --git a/services/fuse/arvados_fuse/fusedir.py b/services/fuse/arvados_fuse/fusedir.py
index d90bd8b..9b93187 100644
--- a/services/fuse/arvados_fuse/fusedir.py
+++ b/services/fuse/arvados_fuse/fusedir.py
@@ -264,12 +264,26 @@ class CollectionDirectoryBase(Directory):
self.collection.remove(name)
def rename(self, name_old, name_new, src):
+ if not isinstance(src, CollectionDirectoryBase):
+ raise llfuse.FUSEError(errno.EPERM)
+
+ if name_new in self:
+ ent = src[name_old]
+ tgt = self[name_new]
+ if isinstance(FuseArvadosFile, ent) and isinstance(FuseArvadosFile, tgt):
+ pass
+ elif isinstance(CollectionDirectoryBase, ent) and isinstance(CollectionDirectoryBase, tgt):
+ if len(tgt) > 0:
+ raise llfuse.FUSEError(errno.ENOTEMPTY)
+ elif isinstance(CollectionDirectoryBase, ent) and isinstance(FuseArvadosFile, tgt):
+ raise llfuse.FUSEError(errno.ENOTDIR)
+ elif isinstance(FuseArvadosFile, ent) and isinstance(CollectionDirectoryBase, tgt):
+ raise llfuse.FUSEError(errno.EISDIR)
+
with llfuse.lock_released:
- if not isinstance(src, CollectionDirectoryBase):
- raise llfuse.FUSEError(errno.EPERM)
self.collection.rename(name_old, name_new, source_collection=src.collection, overwrite=True)
- self.flush()
- src.flush()
+ self.flush()
+ src.flush()
class CollectionDirectory(CollectionDirectoryBase):
@@ -679,12 +693,29 @@ class ProjectDirectory(Directory):
self.invalidate()
def rename(self, name_old, name_new, src):
- with llfuse.lock_released:
- if not isinstance(src, ProjectDirectory):
- raise llfuse.FUSEError(errno.EPERM)
+ if not isinstance(src, ProjectDirectory):
+ raise llfuse.FUSEError(errno.EPERM)
- raise NotImplementedError()
+ ent = src[name_old]
+
+ if not isinstance(ent, CollectionDirectory):
+ raise llfuse.FUSEError(errno.EPERM)
+
+ if name_new in self:
+ # POSIX semantics for replacing one directory with another is
+ # tricky (the target directory must be empty, the operation must be
+ # atomic which isn't possible with the Arvados API as of this
+ # writing) so don't support that.
+ raise llfuse.FUSEError(errno.EPERM)
+
+ self.api.collections().update(uuid=ent.uuid(),
+ body={"owner_uuid": self.uuid(),
+ "name": name_new}).execute(num_retries=self.num_retries)
+ # Acually move the entry from source directory to this directory.
+ del src._entries[name_old]
+ self._entries[name_new] = ent
+ llfuse.invalidate_entry(src.inode, name_old)
class SharedDirectory(Directory):
"""A special directory that represents users or groups who have shared projects with me."""
diff --git a/services/fuse/arvados_fuse/fusefile.py b/services/fuse/arvados_fuse/fusefile.py
index 846e043..77b70f5 100644
--- a/services/fuse/arvados_fuse/fusefile.py
+++ b/services/fuse/arvados_fuse/fusefile.py
@@ -1,6 +1,7 @@
import logging
import re
import json
+import llfuse
from fresh import FreshBase, convertTime
@@ -59,8 +60,9 @@ class FuseArvadosFile(File):
return self.arvfile.writable()
def flush(self):
- if self.writable():
- self.arvfile.parent.root_collection().save()
+ with llfuse.lock_released:
+ if self.writable():
+ self.arvfile.parent.root_collection().save()
class StringFile(File):
@@ -87,6 +89,9 @@ class ObjectFile(StringFile):
def uuid(self):
return self.object_uuid
- def update(self, obj):
+ def update(self, obj=None):
self._mtime = convertTime(obj['modified_at']) if 'modified_at' in obj else 0
self.contents = json.dumps(obj, indent=4, sort_keys=True) + "\n"
+
+ def persisted(self):
+ return True
diff --git a/services/fuse/tests/test_mount.py b/services/fuse/tests/test_mount.py
index 130ac81..82d8ec7 100644
--- a/services/fuse/tests/test_mount.py
+++ b/services/fuse/tests/test_mount.py
@@ -739,6 +739,8 @@ class FuseRenameTest(MountTestBase):
class FuseUpdateFromEventTest(MountTestBase):
def runTest(self):
+ arvados.logger.setLevel(logging.DEBUG)
+
collection = arvados.collection.Collection(api_client=self.api)
collection.save_new()
@@ -1005,6 +1007,39 @@ class FuseProjectMkdirRmdirTest(MountTestBase):
d1 = llfuse.listdir(self.mounttmp)
self.assertNotIn('testcollection', d1)
+
+def fuseProjectMvTestHelper1(mounttmp):
+ class Test(unittest.TestCase):
+ def runTest(self):
+ d1 = llfuse.listdir(mounttmp)
+ self.assertNotIn('testcollection', d1)
+
+ os.mkdir(os.path.join(mounttmp, "testcollection"))
+
+ d1 = llfuse.listdir(mounttmp)
+ self.assertIn('testcollection', d1)
+
+ with self.assertRaises(OSError):
+ os.rename(os.path.join(mounttmp, "testcollection"), os.path.join(mounttmp, 'Unrestricted public data'))
+
+ os.rename(os.path.join(mounttmp, "testcollection"), os.path.join(mounttmp, 'Unrestricted public data', 'testcollection'))
+
+ d1 = llfuse.listdir(mounttmp)
+ self.assertNotIn('testcollection', d1)
+
+ d1 = llfuse.listdir(os.path.join(mounttmp, 'Unrestricted public data'))
+ self.assertIn('testcollection', d1)
+
+ Test().runTest()
+
+class FuseProjectMvTest(MountTestBase):
+ def runTest(self):
+ self.make_mount(fuse.ProjectDirectory,
+ project_object=self.api.users().current().execute())
+
+ self.pool.apply(fuseProjectMvTestHelper1, (self.mounttmp,))
+
+
class FuseUnitTest(unittest.TestCase):
def test_sanitize_filename(self):
acceptable = [
commit 32f8850d66e388fe0c086f8e1e4c74658c34fad0
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date: Thu May 14 10:09:27 2015 -0400
3198: Start working on rename() for collections in projects
diff --git a/services/fuse/arvados_fuse/fusedir.py b/services/fuse/arvados_fuse/fusedir.py
index 4de9c0b..d90bd8b 100644
--- a/services/fuse/arvados_fuse/fusedir.py
+++ b/services/fuse/arvados_fuse/fusedir.py
@@ -659,9 +659,9 @@ class ProjectDirectory(Directory):
def mkdir(self, name):
try:
with llfuse.lock_released:
- new_collection = self.api.collections().create(body={"owner_uuid": self.project_uuid,
- "name": name,
- "manifest_text": ""}).execute(num_retries=self.num_retries)
+ self.api.collections().create(body={"owner_uuid": self.project_uuid,
+ "name": name,
+ "manifest_text": ""}).execute(num_retries=self.num_retries)
self.invalidate()
except apiclient_errors.Error as error:
_logger.error(error)
@@ -679,6 +679,10 @@ class ProjectDirectory(Directory):
self.invalidate()
def rename(self, name_old, name_new, src):
+ with llfuse.lock_released:
+ if not isinstance(src, ProjectDirectory):
+ raise llfuse.FUSEError(errno.EPERM)
+
raise NotImplementedError()
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list