3198: writeto() notifies with WRITE instead of MOD. WRITE doesn't invalidate the...
authorPeter Amstutz <peter.amstutz@curoverse.com>
Mon, 18 May 2015 14:10:26 +0000 (10:10 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Mon, 18 May 2015 14:10:26 +0000 (10:10 -0400)
Move llfuse.lock_released down one level into individual fusefile and fusedir methods.
Add big_writes option, improves write speed by 2x!

sdk/python/arvados/arvfile.py
services/fuse/arvados_fuse/__init__.py
services/fuse/arvados_fuse/fusefile.py
services/fuse/bin/arv-mount

index 835e53e82cd900bb802b091a0aa9b9702c17f53f..792c81f1e6868e678233ef2508659d3fec621e96 100644 (file)
@@ -18,6 +18,7 @@ from ._ranges import locators_and_ranges, replace_range, Range
 from .retry import retry_method
 
 MOD = "mod"
+WRITE = "write"
 
 _logger = logging.getLogger('arvados.arvfile')
 
@@ -574,7 +575,8 @@ class _BlockManager(object):
         for k,v in items:
             # flush again with wait=True to remove committed bufferblocks from
             # the segments.
-            v.owner.flush(True)
+            if v.owner:
+                v.owner.flush(True)
 
 
     def block_prefetch(self, locator):
@@ -840,7 +842,7 @@ class ArvadosFile(object):
 
         replace_range(self._segments, offset, len(data), self._current_bblock.blockid, self._current_bblock.write_pointer - len(data))
 
-        self.parent.notify(MOD, self.parent, self.name, (self, self))
+        self.parent.notify(WRITE, self.parent, self.name, (self, self))
 
         return len(data)
 
@@ -864,7 +866,6 @@ class ArvadosFile(object):
                 for s in to_delete:
                    self.parent._my_block_manager().delete_bufferblock(s)
 
-            self.parent.notify(MOD, self.parent, self.name, (self, self))
 
     @must_be_writable
     @synchronized
index 9df9429e2587d13d723ecdd84e7497bbaadf7ca2..fc810873fdaa724098b4358d63cb05cdb9b0e7ed 100644 (file)
@@ -366,10 +366,9 @@ class Operations(llfuse.Operations):
         self.inodes.touch(handle.obj)
 
         try:
-            with llfuse.lock_released:
-                return handle.obj.readfrom(off, size, self.num_retries)
+            return handle.obj.readfrom(off, size, self.num_retries)
         except arvados.errors.NotFoundError as e:
-            _logger.warning("Block not found: " + str(e))
+            _logger.error("Block not found: " + str(e))
             raise llfuse.FUSEError(errno.EIO)
 
     @catch_exceptions
@@ -385,8 +384,7 @@ class Operations(llfuse.Operations):
 
         self.inodes.touch(handle.obj)
 
-        with llfuse.lock_released:
-            return handle.obj.writeto(off, buf, self.num_retries)
+        return handle.obj.writeto(off, buf, self.num_retries)
 
     @catch_exceptions
     def release(self, fh):
index 77b70f5992bd619854a0324570d69103ab232922..d09b1f007ca13899090cdcfba98c2d54f64b734b 100644 (file)
@@ -48,10 +48,12 @@ class FuseArvadosFile(File):
         return self.arvfile.size()
 
     def readfrom(self, off, size, num_retries=0):
-        return self.arvfile.readfrom(off, size, num_retries, exact=True)
+        with llfuse.lock_released:
+            return self.arvfile.readfrom(off, size, num_retries, exact=True)
 
     def writeto(self, off, buf, num_retries=0):
-        return self.arvfile.writeto(off, buf, num_retries)
+        with llfuse.lock_released:
+            return self.arvfile.writeto(off, buf, num_retries)
 
     def stale(self):
         return False
index 5a3e0215388a3077b78a117e9064ff0acc8984a9..49874da6195845ac62c15436ecb82b034e0aedab 100755 (executable)
@@ -156,6 +156,8 @@ From here, the following directories are available:
     opts = [optname for optname in ['allow_other', 'debug']
             if getattr(args, optname)]
 
+    opts += ["big_writes", "max_read=131072"]
+
     if args.exec_args:
         # Initialize the fuse connection
         llfuse.init(operations, args.mountpoint, opts)