1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2024-12-25 17:27:31 +00:00

Merge pull request #6575 from ThomasWaldmann/more-robust-iterator-master

borg check improvements (master)
This commit is contained in:
TW 2022-04-12 18:13:51 +02:00 committed by GitHub
commit bc3b2eb719
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1955,20 +1955,25 @@ def valid_item(obj):
if state > 0:
unpacker.resync()
for chunk_id, cdata in zip(items, repository.get_many(items)):
try:
data = self.key.decrypt(chunk_id, cdata)
unpacker.feed(data)
try:
for item in unpacker:
valid, reason = valid_item(item)
if valid:
yield Item(internal_dict=item)
else:
report('Did not get expected metadata dict when unpacking item metadata (%s)' % reason, chunk_id, i)
except IntegrityError as integrity_error:
# key.decrypt() detected integrity issues.
# maybe the repo gave us a valid cdata, but not for the chunk_id we wanted.
# or the authentication of cdata failed, meaning the encrypted data was corrupted.
report(str(integrity_error), chunk_id, i)
except msgpack.UnpackException:
report('Unpacker crashed while unpacking item metadata, trying to resync...', chunk_id, i)
unpacker.resync()
except Exception:
report('Exception while unpacking item metadata', chunk_id, i)
report('Exception while decrypting or unpacking item metadata', chunk_id, i)
raise
i += 1
@ -2002,13 +2007,19 @@ def valid_item(obj):
logger.info(f'Analyzing archive {info.name} ({i + 1}/{num_archives})')
archive_id = info.id
if archive_id not in self.chunks:
logger.error('Archive metadata block is missing!')
logger.error('Archive metadata block %s is missing!', bin_to_hex(archive_id))
self.error_found = True
del self.manifest.archives[info.name]
continue
mark_as_possibly_superseded(archive_id)
cdata = self.repository.get(archive_id)
try:
data = self.key.decrypt(archive_id, cdata)
except IntegrityError as integrity_error:
logger.error('Archive metadata block %s is corrupted: %s', bin_to_hex(archive_id), integrity_error)
self.error_found = True
del self.manifest.archives[info.name]
continue
archive = ArchiveItem(internal_dict=msgpack.unpackb(data))
if archive.version != 1:
raise Exception('Unknown archive metadata version')