Merge branch 'master' into 3198-writable-fuse
[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         self.ref_count = 0
35         self.dead = False
36         self.cache_priority = None
37         self.cache_size = 0
38         self.cache_uuid = None
39
40     # Mark the value as stale
41     def invalidate(self):
42         self._stale = True
43
44     # Test if the entries dict is stale.
45     def stale(self):
46         if self._stale:
47             return True
48         if self._poll:
49             return (self._last_update + self._poll_time) < self._atime
50         return False
51
52     def fresh(self):
53         self._stale = False
54         self._last_update = time.time()
55
56     def atime(self):
57         return self._atime
58
59     def persisted(self):
60         return False
61
62     def clear(self, force=False):
63         pass
64
65     def in_use(self):
66         return self.use_count > 0
67
68     def inc_use(self):
69         self.use_count += 1
70
71     def dec_use(self):
72         self.use_count -= 1
73
74     def inc_ref(self):
75         self.ref_count += 1
76         return self.ref_count
77
78     def dec_ref(self, n):
79         self.ref_count -= n
80         return self.ref_count
81
82     def objsize(self):
83         return 0
84
85     def uuid(self):
86         return None