X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/27616fe74103c079a84ac34b2adb83f1952c5772..8fd360faf91921c557f44f079b127a4fa5830486:/services/fuse/arvados_fuse/fresh.py diff --git a/services/fuse/arvados_fuse/fresh.py b/services/fuse/arvados_fuse/fresh.py index 6ecf35c612..2e7a2a8182 100644 --- a/services/fuse/arvados_fuse/fresh.py +++ b/services/fuse/arvados_fuse/fresh.py @@ -1,3 +1,7 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + import time import ciso8601 import calendar @@ -8,7 +12,7 @@ def convertTime(t): if not t: return 0 try: - return calendar.timegm(ciso8601.parse_datetime_unaware(t).timetuple()) + return calendar.timegm(ciso8601.parse_datetime_as_naive(t).timetuple()) except (TypeError, ValueError): return 0 @@ -55,6 +59,10 @@ class FreshBase(object): * Clear the object contents (invalidates the object) """ + + __slots__ = ("_stale", "_poll", "_last_update", "_atime", "_poll_time", "use_count", + "ref_count", "dead", "cache_size", "cache_uuid", "allow_attr_cache") + def __init__(self): self._stale = True self._poll = False @@ -64,14 +72,20 @@ class FreshBase(object): self.use_count = 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 + # Can the kernel cache attributes? + self.allow_attr_cache = True + def invalidate(self): + """Indicate that object contents should be refreshed from source.""" self._stale = True + def kernel_invalidate(self): + """Indicate that an invalidation for this object should be sent to the kernel.""" + pass + # Test if the entries dict is stale. def stale(self): if self._stale: @@ -90,7 +104,7 @@ class FreshBase(object): def persisted(self): return False - def clear(self, force=False): + def clear(self): pass def in_use(self): @@ -110,8 +124,36 @@ class FreshBase(object): self.ref_count -= n return self.ref_count + def has_ref(self, only_children): + """Determine if there are any kernel references to this + object or its children. + + If only_children is True, ignore refcount of self and only consider + children. + """ + if only_children: + return False + else: + return self.ref_count > 0 + def objsize(self): return 0 def uuid(self): return None + + def finalize(self): + pass + + def child_event(self, ev): + pass + + def time_to_next_poll(self): + if self._poll: + t = (self._last_update + self._poll_time) - self._atime + if t < 0: + return 0 + else: + return t + else: + return self._poll_time