mirror of
https://github.com/borgbackup/borg.git
synced 2025-01-18 21:39:24 +00:00
Merge pull request #3567 from ThomasWaldmann/files-cache-exception-handling-1.1
files cache: improve exception handling, fixes #3553 (1.1)
This commit is contained in:
commit
19032f72da
2 changed files with 29 additions and 26 deletions
|
@ -502,25 +502,32 @@ 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
|
||||||
with IntegrityCheckedFile(path=os.path.join(self.path, 'files'), write=False,
|
try:
|
||||||
integrity_data=self.cache_config.integrity.get('files')) as fd:
|
with IntegrityCheckedFile(path=os.path.join(self.path, 'files'), write=False,
|
||||||
u = msgpack.Unpacker(use_list=True)
|
integrity_data=self.cache_config.integrity.get('files')) as fd:
|
||||||
while True:
|
u = msgpack.Unpacker(use_list=True)
|
||||||
data = fd.read(64 * 1024)
|
while True:
|
||||||
if not data:
|
data = fd.read(64 * 1024)
|
||||||
break
|
if not data:
|
||||||
u.feed(data)
|
break
|
||||||
try:
|
u.feed(data)
|
||||||
for path_hash, item in u:
|
try:
|
||||||
entry = FileCacheEntry(*item)
|
for path_hash, item in u:
|
||||||
# in the end, this takes about 240 Bytes per file
|
entry = FileCacheEntry(*item)
|
||||||
self.files[path_hash] = msgpack.packb(entry._replace(age=entry.age + 1))
|
# in the end, this takes about 240 Bytes per file
|
||||||
except (TypeError, ValueError) as exc:
|
self.files[path_hash] = msgpack.packb(entry._replace(age=entry.age + 1))
|
||||||
logger.warning('The files cache seems corrupt, ignoring it. '
|
except (TypeError, ValueError) as exc:
|
||||||
'Expect lower performance. [%s]' % str(exc))
|
msg = "The files cache seems invalid. [%s]" % str(exc)
|
||||||
self.files = {}
|
break
|
||||||
return
|
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):
|
def begin_txn(self):
|
||||||
# Initialize transaction snapshot
|
# Initialize transaction snapshot
|
||||||
|
|
|
@ -3331,13 +3331,9 @@ def test_cache_chunks(self):
|
||||||
def test_cache_files(self):
|
def test_cache_files(self):
|
||||||
self.cmd('create', self.repository_location + '::test', 'input')
|
self.cmd('create', self.repository_location + '::test', 'input')
|
||||||
self.corrupt(os.path.join(self.cache_path, 'files'))
|
self.corrupt(os.path.join(self.cache_path, 'files'))
|
||||||
|
out = self.cmd('create', self.repository_location + '::test1', 'input')
|
||||||
if self.FORK_DEFAULT:
|
# borg warns about the corrupt files cache, but then continues without files cache.
|
||||||
out = self.cmd('create', self.repository_location + '::test1', 'input', exit_code=2)
|
assert 'files cache is corrupted' in out
|
||||||
assert 'failed integrity check' in out
|
|
||||||
else:
|
|
||||||
with pytest.raises(FileIntegrityError):
|
|
||||||
self.cmd('create', self.repository_location + '::test1', 'input')
|
|
||||||
|
|
||||||
def test_chunks_archive(self):
|
def test_chunks_archive(self):
|
||||||
self.cmd('create', self.repository_location + '::test1', 'input')
|
self.cmd('create', self.repository_location + '::test1', 'input')
|
||||||
|
|
Loading…
Reference in a new issue