From cd3cbee962f9b6d761e1123ce293337a68d32f15 Mon Sep 17 00:00:00 2001 From: Abogical Date: Sat, 18 Feb 2017 01:56:18 +0200 Subject: [PATCH] Refactor unique chunks summing --- src/borg/helpers.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/borg/helpers.py b/src/borg/helpers.py index 502ab1e6f..d45ae887e 100644 --- a/src/borg/helpers.py +++ b/src/borg/helpers.py @@ -1481,8 +1481,8 @@ class ItemFormatter(BaseFormatter): self.call_keys = { 'size': self.calculate_size, 'csize': self.calculate_csize, - 'dsize': self.calculate_dsize, - 'dcsize': self.calculate_dcsize, + 'dsize': partial(self.sum_unique_chunks_metadata, lambda chunk: chunk.size), + 'dcsize': partial(self.sum_unique_chunks_metadata, lambda chunk: chunk.csize), 'num_chunks': self.calculate_num_chunks, 'unique_chunks': self.calculate_unique_chunks, 'isomtime': partial(self.format_time, 'mtime'), @@ -1531,6 +1531,20 @@ class ItemFormatter(BaseFormatter): item_data[key] = self.call_keys[key](item) return item_data + def sum_unique_chunks_metadata(self, metadata_func, item): + """ + sum unique chunks metadata, a unique chunk is a chunk which is referenced globally as often as it is in the + item + + item: The item to sum its unique chunks' metadata + metadata_func: A function that takes a parameter of type ChunkIndexEntry and returns a number, used to return + the metadata needed from the chunk + """ + chunk_index = self.archive.cache.chunks + chunks = item.get('chunks', []) + chunks_counter = Counter(c.id for c in chunks) + return sum(metadata_func(c) for c in chunks if chunk_index[c.id].refcount == chunks_counter[c.id]) + def calculate_num_chunks(self, item): return len(item.get('chunks', [])) @@ -1544,18 +1558,6 @@ class ItemFormatter(BaseFormatter): def calculate_csize(self, item): return sum(c.csize for c in item.get('chunks', [])) - def calculate_dsize(self, item): - chunk_index = self.archive.cache.chunks - chunks = item.get('chunks', []) - chunks_counter = Counter(c.id for c in chunks) - return sum(c.size for c in chunks if chunk_index[c.id].refcount == chunks_counter[c.id]) - - def calculate_dcsize(self, item): - chunk_index = self.archive.cache.chunks - chunks = item.get('chunks', []) - chunks_counter = Counter(c.id for c in chunks) - return sum(c.csize for c in chunks if chunk_index[c.id].refcount == chunks_counter[c.id]) - def hash_item(self, hash_function, item): if 'chunks' not in item: return ""