fix "attic info" all archives stats, fixes #183

the problem was that calc_stats() dirties cache.chunks by decrementing
the chunk reference counters (so it can compute the deduplicated size
of the archive correctly).

the fix is to create a local Cache instance inside calc_stats, so the dirty cache
instance can not be used elsewhere.

also:
fix internal consistency of calc_stats function: always use "cache" (not "self.cache").
minor cosmetic pep8 fixes
This commit is contained in:
Thomas Waldmann 2015-04-19 18:50:10 +02:00
parent e815d6da8e
commit 212777d716
2 changed files with 10 additions and 6 deletions

View file

@ -14,6 +14,7 @@ import sys
import time
from io import BytesIO
from attic import xattr
from attic.cache import Cache
from attic.platform import acl_get, acl_set
from attic.chunker import Chunker
from attic.hashindex import ChunkIndex
@ -206,19 +207,22 @@ class Archive:
self.repository.commit()
self.cache.commit()
def calc_stats(self, cache):
def calc_stats(self):
def add(id):
count, size, csize = self.cache.chunks[id]
count, size, csize = cache.chunks[id]
stats.update(size, csize, count == 1)
self.cache.chunks[id] = count - 1, size, csize
cache.chunks[id] = count - 1, size, csize # dirties cache.chunks!
def add_file_chunks(chunks):
for id, _, _ in chunks:
add(id)
# This function is a bit evil since it abuses the cache to calculate
# the stats. The cache transaction must be rolled back afterwards
unpacker = msgpack.Unpacker(use_list=False)
# the stats. The cache transaction must be rolled back afterwards.
cache = Cache(self.repository, self.key, self.manifest)
cache.begin_txn()
stats = Statistics()
unpacker = msgpack.Unpacker(use_list=False)
add(self.id)
for id, chunk in zip(self.metadata[b'items'], self.repository.get_many(self.metadata[b'items'])):
add(id)

View file

@ -305,7 +305,7 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
manifest, key = Manifest.load(repository)
cache = Cache(repository, key, manifest)
archive = Archive(repository, key, manifest, args.archive.archive, cache=cache)
stats = archive.calc_stats(cache)
stats = archive.calc_stats()
print('Name:', archive.name)
print('Fingerprint: %s' % hexlify(archive.id).decode('ascii'))
print('Hostname:', archive.metadata[b'hostname'])