3198: writeto() notifies with WRITE instead of MOD. WRITE doesn't invalidate the...
[arvados.git] / services / fuse / arvados_fuse / fusefile.py
index 9af341f231337ed0732a3419784e88f676a9c032..d09b1f007ca13899090cdcfba98c2d54f64b734b 100644 (file)
@@ -1,6 +1,7 @@
 import logging
 import re
 import json
+import llfuse
 
 from fresh import FreshBase, convertTime
 
@@ -21,12 +22,20 @@ class File(FreshBase):
     def readfrom(self, off, size, num_retries=0):
         return ''
 
+    def writeto(self, off, size, num_retries=0):
+        raise Exception("Not writable")
+
     def mtime(self):
         return self._mtime
 
     def clear(self, force=False):
         return True
 
+    def writable(self):
+        return False
+
+    def flush(self):
+        pass
 
 class FuseArvadosFile(File):
     """Wraps a ArvadosFile."""
@@ -39,11 +48,24 @@ class FuseArvadosFile(File):
         return self.arvfile.size()
 
     def readfrom(self, off, size, num_retries=0):
-        return self.arvfile.readfrom(off, size, num_retries)
+        with llfuse.lock_released:
+            return self.arvfile.readfrom(off, size, num_retries, exact=True)
+
+    def writeto(self, off, buf, num_retries=0):
+        with llfuse.lock_released:
+            return self.arvfile.writeto(off, buf, num_retries)
 
     def stale(self):
         return False
 
+    def writable(self):
+        return self.arvfile.writable()
+
+    def flush(self):
+        with llfuse.lock_released:
+            if self.writable():
+                self.arvfile.parent.root_collection().save()
+
 
 class StringFile(File):
     """Wrap a simple string as a file"""
@@ -63,9 +85,15 @@ class ObjectFile(StringFile):
 
     def __init__(self, parent_inode, obj):
         super(ObjectFile, self).__init__(parent_inode, "", 0)
-        self.uuid = obj['uuid']
+        self.object_uuid = obj['uuid']
         self.update(obj)
 
-    def update(self, obj):
+    def uuid(self):
+        return self.object_uuid
+
+    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