1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2025-02-22 14:11:27 +00:00

PR #231 - Merge branch 'check_last_N' of https://github.com/ThomasWaldmann/attic into merge

This commit is contained in:
Thomas Waldmann 2015-03-11 03:12:37 +01:00
commit 60ac104a8f
2 changed files with 16 additions and 7 deletions

View file

@ -549,7 +549,7 @@ def __init__(self):
def __del__(self):
shutil.rmtree(self.tmpdir)
def check(self, repository, repair=False):
def check(self, repository, repair=False, last=None):
self.report_progress('Starting archive consistency check...')
self.repair = repair
self.repository = repository
@ -559,8 +559,11 @@ def check(self, repository, repair=False):
self.manifest = self.rebuild_manifest()
else:
self.manifest, _ = Manifest.load(repository, key=self.key)
self.rebuild_refcounts()
self.verify_chunks()
self.rebuild_refcounts(last=last)
if last is None:
self.verify_chunks()
else:
self.report_progress('Orphaned objects check skipped (needs all archives checked)')
if not self.error_found:
self.report_progress('Archive consistency check complete, no problems found.')
return self.repair or not self.error_found
@ -615,7 +618,7 @@ def rebuild_manifest(self):
self.report_progress('Manifest rebuild complete', error=True)
return manifest
def rebuild_refcounts(self):
def rebuild_refcounts(self, last=None):
"""Rebuild object reference counts by walking the metadata
Missing and/or incorrect data is repaired when detected
@ -692,8 +695,11 @@ def missing_chunk_detector(chunk_id):
repository = cache_if_remote(self.repository)
num_archives = len(self.manifest.archives)
for i, (name, info) in enumerate(list(self.manifest.archives.items()), 1):
self.report_progress('Analyzing archive {} ({}/{})'.format(name, i, num_archives))
archive_items = sorted(self.manifest.archives.items(), reverse=True,
key=lambda name_info: name_info[1][b'time'])
end = None if last is None else min(num_archives, last)
for i, (name, info) in enumerate(archive_items[:end]):
self.report_progress('Analyzing archive {} ({}/{})'.format(name, num_archives - i, num_archives))
archive_id = info[b'id']
if not archive_id in self.chunks:
self.report_progress('Archive metadata block is missing', error=True)

View file

@ -81,7 +81,7 @@ def do_check(self, args):
print('Repository check complete, no problems found.')
else:
return 1
if not args.repo_only and not ArchiveChecker().check(repository, repair=args.repair):
if not args.repo_only and not ArchiveChecker().check(repository, repair=args.repair, last=args.last):
return 1
return 0
@ -520,6 +520,9 @@ def run(self, args=None):
subparser.add_argument('--repair', dest='repair', action='store_true',
default=False,
help='attempt to repair any inconsistencies found')
subparser.add_argument('--last', dest='last',
type=int, default=None, metavar='N',
help='only check last N archives (Default: all)')
change_passphrase_epilog = textwrap.dedent("""
The key files used for repository encryption are optionally passphrase