From 68225af4497ae53afdde7a25cc68ea28dc812c51 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Tue, 8 Dec 2015 00:21:46 +0100 Subject: [PATCH] archive checker: remove report_progress, fix log levels --- borg/archive.py | 34 ++++++++++++++++++---------------- borg/archiver.py | 1 + borg/testsuite/archiver.py | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/borg/archive.py b/borg/archive.py index d5b46792c..f4d98a3a7 100644 --- a/borg/archive.py +++ b/borg/archive.py @@ -3,7 +3,6 @@ from datetime import datetime from getpass import getuser from itertools import groupby import errno -import logging from .logger import create_logger logger = create_logger() @@ -663,20 +662,24 @@ class ArchiveChecker: self.possibly_superseded = set() def check(self, repository, repair=False, archive=None, last=None): - self.report_progress('Starting archive consistency check...') + logger.info('Starting archive consistency check...') self.check_all = archive is None and last is None self.repair = repair self.repository = repository self.init_chunks() self.key = self.identify_key(repository) if Manifest.MANIFEST_ID not in self.chunks: + logger.error("Repository manifest not found!") + self.error_found = True self.manifest = self.rebuild_manifest() else: self.manifest, _ = Manifest.load(repository, key=self.key) self.rebuild_refcounts(archive=archive, last=last) self.orphan_chunks_check() self.finish() - if not self.error_found: + if self.error_found: + logger.error('Archive consistency check complete, problems found.') + else: logger.info('Archive consistency check complete, no problems found.') return self.repair or not self.error_found @@ -696,11 +699,6 @@ class ArchiveChecker: for id_ in result: self.chunks[id_] = (0, 0, 0) - def report_progress(self, msg, error=False): - if error: - self.error_found = True - logger.log(logging.ERROR if error else logging.WARNING, msg) - def identify_key(self, repository): cdata = repository.get(next(self.chunks.iteritems())[0]) return key_factory(repository, cdata) @@ -710,7 +708,7 @@ class ArchiveChecker: Iterates through all objects in the repository looking for archive metadata blocks. """ - self.report_progress('Rebuilding missing manifest, this might take some time...', error=True) + logger.info('Rebuilding missing manifest, this might take some time...') manifest = Manifest(self.key, self.repository) for chunk_id, _ in self.chunks.iteritems(): cdata = self.repository.get(chunk_id) @@ -727,9 +725,9 @@ class ArchiveChecker: except (TypeError, ValueError, StopIteration): continue if isinstance(archive, dict) and b'items' in archive and b'cmdline' in archive: - self.report_progress('Found archive ' + archive[b'name'].decode('utf-8'), error=True) + logger.info('Found archive %s', archive[b'name'].decode('utf-8')) manifest.archives[archive[b'name'].decode('utf-8')] = {b'id': chunk_id, b'time': archive[b'time']} - self.report_progress('Manifest rebuild complete', error=True) + logger.info('Manifest rebuild complete.') return manifest def rebuild_refcounts(self, archive=None, last=None): @@ -771,7 +769,8 @@ class ArchiveChecker: for chunk_id, size, csize in item[b'chunks']: if chunk_id not in self.chunks: # If a file chunk is missing, create an all empty replacement chunk - self.report_progress('{}: Missing file chunk detected (Byte {}-{})'.format(item[b'path'].decode('utf-8', 'surrogateescape'), offset, offset + size), error=True) + logger.error('{}: Missing file chunk detected (Byte {}-{})'.format(item[b'path'].decode('utf-8', 'surrogateescape'), offset, offset + size)) + self.error_found = True data = bytes(size) chunk_id = self.key.id_hash(data) cdata = self.key.encrypt(data) @@ -800,7 +799,8 @@ class ArchiveChecker: def report(msg, chunk_id, chunk_no): cid = hexlify(chunk_id).decode('ascii') msg += ' [chunk: %06d_%s]' % (chunk_no, cid) # see debug-dump-archive-items - self.report_progress(msg, error=True) + self.error_found = True + logger.error(msg) i = 0 for state, items in groupby(archive[b'items'], missing_chunk_detector): @@ -841,7 +841,8 @@ class ArchiveChecker: logger.info('Analyzing archive {} ({}/{})'.format(name, num_archives - i, num_archives)) archive_id = info[b'id'] if archive_id not in self.chunks: - self.report_progress('Archive metadata block is missing', error=True) + logger.error('Archive metadata block is missing!') + self.error_found = True del self.manifest.archives[name] continue mark_as_possibly_superseded(archive_id) @@ -876,12 +877,13 @@ class ArchiveChecker: unused.add(id_) orphaned = unused - self.possibly_superseded if orphaned: - self.report_progress('{} orphaned objects found'.format(len(orphaned)), error=True) + logger.error('{} orphaned objects found!'.format(len(orphaned))) + self.error_found = True if self.repair: for id_ in unused: self.repository.delete(id_) else: - self.report_progress('Orphaned objects check skipped (needs all archives checked)') + logger.warning('Orphaned objects check skipped (needs all archives checked).') def finish(self): if self.repair: diff --git a/borg/archiver.py b/borg/archiver.py index 47c000aed..fe9813d2f 100644 --- a/borg/archiver.py +++ b/borg/archiver.py @@ -109,6 +109,7 @@ class Archiver: if repository.check(repair=args.repair): logger.info('Repository check complete, no problems found.') else: + logger.error('Repository check complete, problems found.') return EXIT_WARNING if not args.repo_only and not ArchiveChecker().check( repository, repair=args.repair, archive=args.repository.archive, last=args.last): diff --git a/borg/testsuite/archiver.py b/borg/testsuite/archiver.py index 9472cc7c9..8e24671b9 100644 --- a/borg/testsuite/archiver.py +++ b/borg/testsuite/archiver.py @@ -992,7 +992,7 @@ class ArchiverCheckTestCase(ArchiverTestCaseBase): repository.delete(Manifest.MANIFEST_ID) repository.commit() self.cmd('check', self.repository_location, exit_code=1) - output = self.cmd('check', '--repair', self.repository_location, exit_code=0) + output = self.cmd('check', '-v', '--repair', self.repository_location, exit_code=0) self.assert_in('archive1', output) self.assert_in('archive2', output) self.cmd('check', self.repository_location, exit_code=0)