[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