3198: Manage inode cache based on (approximate) object size instead of object
[arvados.git] / services / fuse / arvados_fuse / fresh.py
1 import time
2 import ciso8601
3 import calendar
4 import functools
5
6 def convertTime(t):
7     """Parse Arvados timestamp to unix time."""
8     if not t:
9         return 0
10     try:
11         return calendar.timegm(ciso8601.parse_datetime_unaware(t).timetuple())
12     except (TypeError, ValueError):
13         return 0
14
15 def use_counter(orig_func):
16     @functools.wraps(orig_func)
17     def use_counter_wrapper(self, *args, **kwargs):
18         try:
19             self.inc_use()
20             return orig_func(self, *args, **kwargs)
21         finally:
22             self.dec_use()
23     return use_counter_wrapper
24
25 class FreshBase(object):
26     """Base class for maintaining fresh/stale state to determine when to update."""
27     def __init__(self):
28         self._stale = True
29         self._poll = False
30         self._last_update = time.time()
31         self._atime = time.time()
32         self._poll_time = 60
33         self.use_count = 0
34
35     # Mark the value as stale
36     def invalidate(self):
37         self._stale = True
38
39     # Test if the entries dict is stale.
40     def stale(self):
41         if self._stale:
42             return True
43         if self._poll:
44             return (self._last_update + self._poll_time) < self._atime
45         return False
46
47     def fresh(self):
48         self._stale = False
49         self._last_update = time.time()
50
51     def atime(self):
52         return self._atime
53
54     def persisted(self):
55         return False
56
57     def clear(self, force=False):
58         pass
59
60     def in_use(self):
61         return self.use_count > 0
62
63     def inc_use(self):
64         self.use_count += 1
65
66     def dec_use(self):
67         self.use_count -= 1
68
69     def objsize(self):
70         return 0