|
@@ -549,7 +549,7 @@ class ArchiveChecker:
|
|
|
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 @@ class ArchiveChecker:
|
|
|
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 @@ class ArchiveChecker:
|
|
|
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 @@ class ArchiveChecker:
|
|
|
|
|
|
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)
|