borg extract: check file size consistency

This commit is contained in:
Thomas Waldmann 2017-02-20 22:24:19 +01:00
parent adc4da280d
commit 7da0a9c982
1 changed files with 13 additions and 1 deletions

View File

@ -467,13 +467,20 @@ Utilization of max. archive size: {csize_max:.0%}
has_damaged_chunks = 'chunks_healthy' in item has_damaged_chunks = 'chunks_healthy' in item
if dry_run or stdout: if dry_run or stdout:
if 'chunks' in item: if 'chunks' in item:
item_chunks_size = 0
for _, data in self.pipeline.fetch_many([c.id for c in item.chunks], is_preloaded=True): for _, data in self.pipeline.fetch_many([c.id for c in item.chunks], is_preloaded=True):
if pi: if pi:
pi.show(increase=len(data), info=[remove_surrogates(item.path)]) pi.show(increase=len(data), info=[remove_surrogates(item.path)])
if stdout: if stdout:
sys.stdout.buffer.write(data) sys.stdout.buffer.write(data)
item_chunks_size += len(data)
if stdout: if stdout:
sys.stdout.buffer.flush() sys.stdout.buffer.flush()
if 'size' in item:
item_size = item.size
if item_size != item_chunks_size:
logger.warning('{}: size inconsistency detected: size {}, chunks size {}'.format(
item.path, item_size, item_chunks_size))
if has_damaged_chunks: if has_damaged_chunks:
logger.warning('File %s has damaged (all-zero) chunks. Try running borg check --repair.' % logger.warning('File %s has damaged (all-zero) chunks. Try running borg check --repair.' %
remove_surrogates(item.path)) remove_surrogates(item.path))
@ -530,10 +537,15 @@ Utilization of max. archive size: {csize_max:.0%}
else: else:
fd.write(data) fd.write(data)
with backup_io('truncate'): with backup_io('truncate'):
pos = fd.tell() pos = item_chunks_size = fd.tell()
fd.truncate(pos) fd.truncate(pos)
fd.flush() fd.flush()
self.restore_attrs(path, item, fd=fd.fileno()) self.restore_attrs(path, item, fd=fd.fileno())
if 'size' in item:
item_size = item.size
if item_size != item_chunks_size:
logger.warning('{}: size inconsistency detected: size {}, chunks size {}'.format(
item.path, item_size, item_chunks_size))
if has_damaged_chunks: if has_damaged_chunks:
logger.warning('File %s has damaged (all-zero) chunks. Try running borg check --repair.' % logger.warning('File %s has damaged (all-zero) chunks. Try running borg check --repair.' %
remove_surrogates(item.path)) remove_surrogates(item.path))