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