Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions src/borg/archive.py
Original file line number Diff line number Diff line change
Expand Up @@ -1300,13 +1300,31 @@ def chunk_processor(chunk):
# to get rid of .chunks_healthy, as it might not correspond to .chunks any more.
if self.rechunkify and "chunks_healthy" in item:
del item.chunks_healthy
for chunk in chunk_iter:
cle = chunk_processor(chunk)
item.chunks.append(cle)
self.current_volume += cle[1]
if show_progress:
stats.show_progress(item=item, dt=0.2)
self.maybe_checkpoint(item)
try:
for chunk in chunk_iter:
cle = chunk_processor(chunk)
item.chunks.append(cle)
self.current_volume += cle[1]
if show_progress:
stats.show_progress(item=item, dt=0.2)
self.maybe_checkpoint(item)
except BackupOSError:
# something went wrong (e.g. an I/O error while reading a source file), try to avoid orphan content chunks:
# case A: "no checkpoint archive has been created yet":
# we have incref'd (written) some chunks, no commit yet, no file item for these chunks yet.
# -> item.chunks has a list of orphaned content chunks, we need to decref them.
# case B: "some checkpoint archives have been created already":
# at the time we commit them, everything is fine and consistent:
# we have incref'd (written) some chunks, created a part file item referencing them, committed.
# directly after commit, we have removed the part file item, but kept chunks in the repo, kept refcounts.
# maybe we have incref'd (written) some more chunks after the commit, no file item for these chunks yet.
# -> item.chunks has a list of orphaned content chunks, we need to decref them.
# So, cases A and B need same treatment.
for chunk in item.chunks:
cache.chunk_decref(chunk.id, stats, wait=False)
# now that we have cleaned up the chunk references, we can re-raise the exception
# this will skip THIS processing of this file, but continue with the next one.
raise


class FilesystemObjectProcessors:
Expand Down