|
@@ -1,11 +1,12 @@
|
|
|
from __future__ import with_statement
|
|
|
from ConfigParser import RawConfigParser
|
|
|
import fcntl
|
|
|
+from itertools import izip_longest
|
|
|
import msgpack
|
|
|
import os
|
|
|
import shutil
|
|
|
|
|
|
-from .helpers import get_cache_dir
|
|
|
+from .helpers import get_cache_dir, Manifest
|
|
|
from .hashindex import ChunkIndex
|
|
|
|
|
|
|
|
@@ -122,26 +123,12 @@ class Cache(object):
|
|
|
def sync(self):
|
|
|
"""Initializes cache by fetching and reading all archive indicies
|
|
|
"""
|
|
|
- def cb(chunk, error, id):
|
|
|
- assert not error
|
|
|
- data = self.key.decrypt(id, chunk)
|
|
|
+ def add(id, size, csize):
|
|
|
try:
|
|
|
count, size, csize = self.chunks[id]
|
|
|
self.chunks[id] = count + 1, size, csize
|
|
|
except KeyError:
|
|
|
- self.chunks[id] = 1, len(data), len(chunk)
|
|
|
- unpacker.feed(data)
|
|
|
- for item in unpacker:
|
|
|
- try:
|
|
|
- for id, size, csize in item['chunks']:
|
|
|
- try:
|
|
|
- count, size, csize = self.chunks[id]
|
|
|
- self.chunks[id] = count + 1, size, csize
|
|
|
- except KeyError:
|
|
|
- self.chunks[id] = 1, size, csize
|
|
|
- pass
|
|
|
- except KeyError:
|
|
|
- pass
|
|
|
+ self.chunks[id] = 1, size, csize
|
|
|
self.begin_txn()
|
|
|
print 'Initializing cache...'
|
|
|
self.chunks.clear()
|
|
@@ -150,30 +137,17 @@ class Cache(object):
|
|
|
id = info['id']
|
|
|
cdata = self.store.get(id)
|
|
|
data = self.key.decrypt(id, cdata)
|
|
|
- try:
|
|
|
- count, size, csize = self.chunks[id]
|
|
|
- self.chunks[id] = count + 1, size, csize
|
|
|
- except KeyError:
|
|
|
- self.chunks[id] = 1, len(data), len(cdata)
|
|
|
+ add(id, len(data), len(cdata))
|
|
|
archive = msgpack.unpackb(data)
|
|
|
print 'Analyzing archive:', archive['name']
|
|
|
- for id in archive['items']:
|
|
|
- chunk = self.store.get(id)
|
|
|
- try:
|
|
|
- count, size, csize = self.chunks[id]
|
|
|
- self.chunks[id] = count + 1, size, csize
|
|
|
- except KeyError:
|
|
|
- self.chunks[id] = 1, len(data), len(chunk)
|
|
|
- unpacker.feed(self.key.decrypt(id, chunk))
|
|
|
+ for id, chunk in izip_longest(archive['items'], self.store.get_many(archive['items'])):
|
|
|
+ data = self.key.decrypt(id, chunk)
|
|
|
+ add(id, len(data), len(chunk))
|
|
|
+ unpacker.feed(data)
|
|
|
for item in unpacker:
|
|
|
try:
|
|
|
for id, size, csize in item['chunks']:
|
|
|
- try:
|
|
|
- count, size, csize = self.chunks[id]
|
|
|
- self.chunks[id] = count + 1, size, csize
|
|
|
- except KeyError:
|
|
|
- self.chunks[id] = 1, size, csize
|
|
|
- pass
|
|
|
+ add(id, size, csize)
|
|
|
except KeyError:
|
|
|
pass
|
|
|
|