3198: Add enable_write flag to FUSE and --enable-write and --read-only to
[arvados.git] / services / fuse / arvados_fuse / fresh.py
index 5acadfdf7a4fb9b41b6f8c32515a8675cc7e9adf..ec2d47a269791786ad38b7cc9b1e0424869b9042 100644 (file)
@@ -22,8 +22,39 @@ def use_counter(orig_func):
             self.dec_use()
     return use_counter_wrapper
 
+def check_update(orig_func):
+    @functools.wraps(orig_func)
+    def check_update_wrapper(self, *args, **kwargs):
+        self.checkupdate()
+        return orig_func(self, *args, **kwargs)
+    return check_update_wrapper
+
 class FreshBase(object):
-    """Base class for maintaining fresh/stale state to determine when to update."""
+    """Base class for maintaining object lifecycle.
+
+    Functions include:
+
+    * Indicate if an object is up to date (stale() == false) or needs to be
+      updated sets stale() == True).  Use invalidate() to mark the object as
+      stale.  An object is also automatically stale if it has not been updated
+      in `_poll_time` seconds.
+
+    * Record access time (atime) timestamp
+
+    * Manage internal use count used by the inode cache ("inc_use" and
+      "dec_use").  An object which is in use cannot be cleared by the inode
+      cache.
+
+    * Manage the kernel reference count ("inc_ref" and "dec_ref").  An object
+      which is referenced by the kernel cannot have its inode entry deleted.
+
+    * Record cache footprint, cache priority
+
+    * Record Arvados uuid at the time the object is placed in the cache
+
+    * Clear the object contents (invalidates the object)
+
+    """
     def __init__(self):
         self._stale = True
         self._poll = False
@@ -31,8 +62,11 @@ class FreshBase(object):
         self._atime = time.time()
         self._poll_time = 60
         self.use_count = 0
-        self.cache_priority = 0
+        self.ref_count = 0
+        self.dead = False
+        self.cache_priority = None
         self.cache_size = 0
+        self.cache_uuid = None
 
     # Mark the value as stale
     def invalidate(self):
@@ -68,5 +102,19 @@ class FreshBase(object):
     def dec_use(self):
         self.use_count -= 1
 
+    def inc_ref(self):
+        self.ref_count += 1
+        return self.ref_count
+
+    def dec_ref(self, n):
+        self.ref_count -= n
+        return self.ref_count
+
     def objsize(self):
         return 0
+
+    def uuid(self):
+        return None
+
+    def finalize(self):
+        pass