Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar_network/client/cache.py
diff options
context:
space:
mode:
Diffstat (limited to 'sugar_network/client/cache.py')
-rw-r--r--sugar_network/client/cache.py40
1 files changed, 29 insertions, 11 deletions
diff --git a/sugar_network/client/cache.py b/sugar_network/client/cache.py
index 988f789..26b940d 100644
--- a/sugar_network/client/cache.py
+++ b/sugar_network/client/cache.py
@@ -34,11 +34,16 @@ class Cache(object):
self._volume = volume
self._pool = None
self._du = 0
+ self._acquired = {}
def __iter__(self):
self._ensure_open()
return iter(self._pool)
+ @property
+ def du(self):
+ return self._du
+
def ensure(self, requested_size, temp_size=0):
self._ensure_open()
to_free = self._to_free(requested_size, temp_size)
@@ -51,26 +56,40 @@ class Cache(object):
if to_free <= 0:
break
- def checkin(self, guid):
+ def acquire(self, guid, size):
+ self.checkout(guid)
+ self._acquired.setdefault(guid, [0, size])[0] += 1
+ return guid
+
+ def release(self, *guids):
+ for guid in guids:
+ acquired = self._acquired.get(guid)
+ if acquired is None:
+ continue
+ acquired[0] -= 1
+ if acquired[0] <= 0:
+ self.checkin(guid, acquired[1])
+ del self._acquired[guid]
+
+ def checkin(self, guid, size):
self._ensure_open()
if guid in self._pool:
self._pool.__getitem__(guid)
return
- _logger.debug('Checkin %r', guid)
- impls = self._volume['implementation']
- meta = impls.get(guid).meta('data')
- size = meta.get('unpack_size') or meta['blob_size']
- mtime = os.stat(impls.path(guid)).st_mtime
+ _logger.debug('Checkin %r %d bytes long', guid, size)
+ mtime = os.stat(self._volume['implementation'].path(guid)).st_mtime
self._pool[guid] = (size, mtime)
+ self._du += size
- def checkout(self, guid):
- self._ensure_open()
+ def checkout(self, guid, *args):
if guid not in self._pool:
- return
+ return False
+ self._ensure_open()
_logger.debug('Checkout %r', guid)
size, __ = self._pool.peek(guid)
self._du -= size
del self._pool[guid]
+ return True
def recycle(self):
self._ensure_open()
@@ -93,13 +112,12 @@ class Cache(object):
_logger.debug('Open implementations pool')
pool = []
- contexts = self._volume['context']
impls = self._volume['implementation']
for res in impls.find(not_layer=['local'])[0]:
meta = res.meta('data')
if not meta or 'blob_size' not in meta:
continue
- clone = contexts.path(res['context'], '.clone')
+ clone = self._volume['context'].path(res['context'], '.clone')
if exists(clone) and basename(os.readlink(clone)) == res.guid:
continue
pool.append((