diff --git a/src/borg/cache.py b/src/borg/cache.py index 14f6460ef..c55dd617d 100644 --- a/src/borg/cache.py +++ b/src/borg/cache.py @@ -502,25 +502,32 @@ class LocalCache(CacheStatsMixin): self.files = {} self._newest_cmtime = None logger.debug('Reading files cache ...') - - with IntegrityCheckedFile(path=os.path.join(self.path, 'files'), write=False, - integrity_data=self.cache_config.integrity.get('files')) as fd: - u = msgpack.Unpacker(use_list=True) - while True: - data = fd.read(64 * 1024) - if not data: - break - u.feed(data) - try: - for path_hash, item in u: - entry = FileCacheEntry(*item) - # in the end, this takes about 240 Bytes per file - self.files[path_hash] = msgpack.packb(entry._replace(age=entry.age + 1)) - except (TypeError, ValueError) as exc: - logger.warning('The files cache seems corrupt, ignoring it. ' - 'Expect lower performance. [%s]' % str(exc)) - self.files = {} - return + msg = None + try: + with IntegrityCheckedFile(path=os.path.join(self.path, 'files'), write=False, + integrity_data=self.cache_config.integrity.get('files')) as fd: + u = msgpack.Unpacker(use_list=True) + while True: + data = fd.read(64 * 1024) + if not data: + break + u.feed(data) + try: + for path_hash, item in u: + entry = FileCacheEntry(*item) + # in the end, this takes about 240 Bytes per file + self.files[path_hash] = msgpack.packb(entry._replace(age=entry.age + 1)) + except (TypeError, ValueError) as exc: + msg = "The files cache seems invalid. [%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 = {} def begin_txn(self): # Initialize transaction snapshot