From adc4da280de41379cd5e9cebee32a40c78148006 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 18 Feb 2017 23:09:40 +0100 Subject: [PATCH] borg check: check file size consistency --- src/borg/archive.py | 7 +++++++ src/borg/item.pyx | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index 7f89a2159..852da6e02 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -1306,6 +1306,13 @@ class ArchiveChecker: logger.info('{}: Completely healed previously damaged file!'.format(item.path)) del item.chunks_healthy item.chunks = chunk_list + if 'size' in item: + item_size = item.size + item_chunks_size = item.get_size(compressed=False, from_chunks=True) + if item_size != item_chunks_size: + # just warn, but keep the inconsistency, so that borg extract can warn about it. + logger.warning('{}: size inconsistency detected: size {}, chunks size {}'.format( + item.path, item_size, item_chunks_size)) def robust_iterator(archive): """Iterates through all archive items diff --git a/src/borg/item.pyx b/src/borg/item.pyx index a71da55e7..627ffd1fb 100644 --- a/src/borg/item.pyx +++ b/src/borg/item.pyx @@ -176,7 +176,7 @@ class Item(PropDict): part = PropDict._make_property('part', int) - def get_size(self, hardlink_masters=None, memorize=False, compressed=False): + def get_size(self, hardlink_masters=None, memorize=False, compressed=False, from_chunks=False): """ Determine the (uncompressed or compressed) size of this item. @@ -187,6 +187,8 @@ class Item(PropDict): """ attr = 'csize' if compressed else 'size' try: + if from_chunks: + raise AttributeError size = getattr(self, attr) except AttributeError: # no precomputed (c)size value available, compute it: