[ARVADOS] updated: 4574dbbacdd10d24cf5ed312d7b8e91ec9d9c14a

git at public.curoverse.com git at public.curoverse.com
Tue Nov 24 10:31:49 EST 2015


Summary of changes:
 services/fuse/arvados_fuse/__init__.py | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

       via  4574dbbacdd10d24cf5ed312d7b8e91ec9d9c14a (commit)
      from  f6bd4a2d80a5092a4306bac61dac90bffdf6211c (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 4574dbbacdd10d24cf5ed312d7b8e91ec9d9c14a
Author: Tom Clegg <tom at curoverse.com>
Date:   Tue Nov 24 10:41:15 2015 -0500

    7751: Fix stack trace on shutdown caused by race between destroy() and llfuse unmount.

diff --git a/services/fuse/arvados_fuse/__init__.py b/services/fuse/arvados_fuse/__init__.py
index a540ebd..b7c0091 100644
--- a/services/fuse/arvados_fuse/__init__.py
+++ b/services/fuse/arvados_fuse/__init__.py
@@ -324,6 +324,12 @@ class Operations(llfuse.Operations):
         # is fully initialized should wait() on this event object.
         self.initlock = threading.Event()
 
+        # If we get overlapping shutdown events (e.g., fusermount -u
+        # -z and operations.destroy()) llfuse calls forget() on inodes
+        # that have already been deleted. To avoid this, we make
+        # forget() a no-op if called after destroy().
+        self._shutdown_started = threading.Event()
+
         self.num_retries = num_retries
 
         self.read_counter = arvados.keep.Counter()
@@ -340,11 +346,13 @@ class Operations(llfuse.Operations):
 
     @catch_exceptions
     def destroy(self):
-        if self.events:
-            self.events.close()
-            self.events = None
+        with llfuse.lock:
+            self._shutdown_started.set()
+            if self.events:
+                self.events.close()
+                self.events = None
 
-        self.inodes.clear()
+            self.inodes.clear()
 
     def access(self, inode, mode, ctx):
         return True
@@ -468,6 +476,8 @@ class Operations(llfuse.Operations):
 
     @catch_exceptions
     def forget(self, inodes):
+        if self._shutdown_started.is_set():
+            return
         for inode, nlookup in inodes:
             ent = self.inodes[inode]
             _logger.debug("arv-mount forget: inode %i nlookup %i ref_count %i", inode, nlookup, ent.ref_count)

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list