Skip to content

Commit a38d87b

Browse files
Merge pull request #9205 from ThomasWaldmann/fix-compact-master
compact: fix dealing with mismatching hints (master)
2 parents f6ac5c4 + d676ef7 commit a38d87b

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/borg/legacyrepository.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,12 @@ def complete_xfer(intermediate=True):
736736
for segment in unused:
737737
logger.debug("complete_xfer: Deleting unused segment %d", segment)
738738
count = self.segments.pop(segment)
739-
assert count == 0, "Corrupted segment reference count - corrupted index or hints"
739+
if count != 0:
740+
logger.warning(
741+
"Corrupted segment reference count %d (expected 0) for segment %d - corrupted index or hints",
742+
count,
743+
segment,
744+
)
740745
self.io.delete_segment(segment)
741746
del self.compact[segment]
742747
unused = []
@@ -748,7 +753,8 @@ def complete_xfer(intermediate=True):
748753
for segment, freeable_space in sorted(self.compact.items()):
749754
if not self.io.segment_exists(segment):
750755
logger.warning("Segment %d not found, but listed in compaction data", segment)
751-
del self.compact[segment]
756+
self.compact.pop(segment, None)
757+
self.segments.pop(segment, None)
752758
pi.show()
753759
self._send_log()
754760
continue
@@ -867,7 +873,12 @@ def complete_xfer(intermediate=True):
867873
if not self.shadow_index[key]:
868874
# shadowed segments list is empty -> remove it
869875
del self.shadow_index[key]
870-
assert segments[segment] == 0, "Corrupted segment reference count - corrupted index or hints"
876+
if segments[segment] != 0:
877+
logger.warning(
878+
"Corrupted segment reference count %d (expected 0) for segment %d - corrupted index or hints",
879+
segments[segment],
880+
segment,
881+
)
871882
unused.append(segment)
872883
pi.show()
873884
self._send_log()

src/borg/testsuite/legacyrepository_test.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -654,17 +654,20 @@ def test_subtly_corrupted_hints(repository):
654654
assert pdchunk(repository.get(H(2))) == b"bazz"
655655

656656

657-
def test_subtly_corrupted_hints_without_integrity(repository):
657+
def test_subtly_corrupted_hints_without_integrity(repository, caplog):
658658
make_auxiliary(repository)
659659
_subtly_corrupted_hints_setup(repository)
660660
integrity_path = os.path.join(repository.path, "integrity.5")
661661
os.unlink(integrity_path)
662662
with repository:
663663
repository.put(H(3), fchunk(b"1234"))
664-
# do a compaction run, which fails since the corrupted refcount wasn't detected and causes an assertion failure.
665-
with pytest.raises(AssertionError) as exc_info:
666-
repository.commit(compact=True)
667-
assert "Corrupted segment reference count" in str(exc_info.value)
664+
# Do a compaction run.
665+
# The corrupted refcount is detected and logged as a warning, but compaction proceeds.
666+
caplog.set_level(logging.WARNING, logger="borg.legacyrepository")
667+
repository.commit(compact=True)
668+
assert "Corrupted segment reference count" in caplog.text
669+
# We verify that the repository is still consistent.
670+
assert repository.check()
668671

669672

670673
def list_indices(repo_path):

0 commit comments

Comments
 (0)