1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2025-02-24 07:01:59 +00:00

files cache: improve exception handling, fixes #3553

now deals with:
- corrupted files cache (truncated or modified not by borg)
- inaccessible/unreadable files cache
- missing files cache

The latter fix is not sufficient, the cache transaction processing
would still stumble over expected, but missing files in the cache.

(cherry picked from commit 423ec4ba1e)
This commit is contained in:
Thomas Waldmann 2018-01-20 06:36:54 +01:00
parent 208ff77ddd
commit 2493598eef

View file

@ -502,7 +502,8 @@ def _read_files(self):
self.files = {} self.files = {}
self._newest_cmtime = None self._newest_cmtime = None
logger.debug('Reading files cache ...') logger.debug('Reading files cache ...')
msg = None
try:
with IntegrityCheckedFile(path=os.path.join(self.path, 'files'), write=False, with IntegrityCheckedFile(path=os.path.join(self.path, 'files'), write=False,
integrity_data=self.cache_config.integrity.get('files')) as fd: integrity_data=self.cache_config.integrity.get('files')) as fd:
u = msgpack.Unpacker(use_list=True) u = msgpack.Unpacker(use_list=True)
@ -517,10 +518,16 @@ def _read_files(self):
# in the end, this takes about 240 Bytes per file # in the end, this takes about 240 Bytes per file
self.files[path_hash] = msgpack.packb(entry._replace(age=entry.age + 1)) self.files[path_hash] = msgpack.packb(entry._replace(age=entry.age + 1))
except (TypeError, ValueError) as exc: except (TypeError, ValueError) as exc:
logger.warning('The files cache seems corrupt, ignoring it. ' msg = "The files cache seems invalid. [%s]" % str(exc)
'Expect lower performance. [%s]' % str(exc)) break
except OSError as exc:
msg = "The files cache can't be read. [%s]" % str(exc)
except FileIntegrityError as fie:
msg = "The files cache is corrupted. [%s]" % str(fie)
if msg is not None:
logger.warning(msg)
logger.warning('Continuing without files cache - expect lower performance.')
self.files = {} self.files = {}
return
def begin_txn(self): def begin_txn(self):
# Initialize transaction snapshot # Initialize transaction snapshot