From 5105a0a5a6cb02805299207b9aac1c236da7deaa Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Wed, 6 Jul 2016 22:42:18 +0200 Subject: [PATCH] repair: remember the good chunks if we do not lose the original chunk ids list when "repairing" a file (replacing missing chunks with all-zero chunks), we have a chance to heal the file back into its original state later, in case the chunks re-appear (e.g. in a fresh backup). --- borg/archive.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/borg/archive.py b/borg/archive.py index fad821a0b..12f11da3e 100644 --- a/borg/archive.py +++ b/borg/archive.py @@ -701,7 +701,7 @@ def _open_rb(path): # this set must be kept complete, otherwise the RobustUnpacker might malfunction: -ITEM_KEYS = frozenset([b'path', b'source', b'rdev', b'chunks', +ITEM_KEYS = frozenset([b'path', b'source', b'rdev', b'chunks', b'chunks_healthy', b'mode', b'user', b'group', b'uid', b'gid', b'mtime', b'atime', b'ctime', b'xattrs', b'bsdflags', b'acl_nfs4', b'acl_access', b'acl_default', b'acl_extended', ]) @@ -933,6 +933,9 @@ def verify_file_chunks(item): add_reference(chunk_id, size, csize) chunk_list.append((chunk_id, size, csize)) offset += size + if b'chunks_healthy' not in item: + # if this is first repair, remember the correct chunk IDs, so we can maybe heal the file later + item[b'chunks_healthy'] = item[b'chunks'] item[b'chunks'] = chunk_list def robust_iterator(archive):