diff --git a/src/borg/legacyrepository.py b/src/borg/legacyrepository.py index 9cdd5f9811..5e626316e9 100644 --- a/src/borg/legacyrepository.py +++ b/src/borg/legacyrepository.py @@ -736,7 +736,12 @@ def complete_xfer(intermediate=True): for segment in unused: logger.debug("complete_xfer: Deleting unused segment %d", segment) count = self.segments.pop(segment) - assert count == 0, "Corrupted segment reference count - corrupted index or hints" + if count != 0: + logger.warning( + "Corrupted segment reference count %d (expected 0) for segment %d - corrupted index or hints", + count, + segment, + ) self.io.delete_segment(segment) del self.compact[segment] unused = [] @@ -748,7 +753,8 @@ def complete_xfer(intermediate=True): for segment, freeable_space in sorted(self.compact.items()): if not self.io.segment_exists(segment): logger.warning("Segment %d not found, but listed in compaction data", segment) - del self.compact[segment] + self.compact.pop(segment, None) + self.segments.pop(segment, None) pi.show() self._send_log() continue @@ -867,7 +873,12 @@ def complete_xfer(intermediate=True): if not self.shadow_index[key]: # shadowed segments list is empty -> remove it del self.shadow_index[key] - assert segments[segment] == 0, "Corrupted segment reference count - corrupted index or hints" + if segments[segment] != 0: + logger.warning( + "Corrupted segment reference count %d (expected 0) for segment %d - corrupted index or hints", + segments[segment], + segment, + ) unused.append(segment) pi.show() self._send_log() diff --git a/src/borg/testsuite/legacyrepository_test.py b/src/borg/testsuite/legacyrepository_test.py index 0b6a10aa5b..31bb5936f1 100644 --- a/src/borg/testsuite/legacyrepository_test.py +++ b/src/borg/testsuite/legacyrepository_test.py @@ -654,17 +654,20 @@ def test_subtly_corrupted_hints(repository): assert pdchunk(repository.get(H(2))) == b"bazz" -def test_subtly_corrupted_hints_without_integrity(repository): +def test_subtly_corrupted_hints_without_integrity(repository, caplog): make_auxiliary(repository) _subtly_corrupted_hints_setup(repository) integrity_path = os.path.join(repository.path, "integrity.5") os.unlink(integrity_path) with repository: repository.put(H(3), fchunk(b"1234")) - # do a compaction run, which fails since the corrupted refcount wasn't detected and causes an assertion failure. - with pytest.raises(AssertionError) as exc_info: - repository.commit(compact=True) - assert "Corrupted segment reference count" in str(exc_info.value) + # Do a compaction run. + # The corrupted refcount is detected and logged as a warning, but compaction proceeds. + caplog.set_level(logging.WARNING, logger="borg.legacyrepository") + repository.commit(compact=True) + assert "Corrupted segment reference count" in caplog.text + # We verify that the repository is still consistent. + assert repository.check() def list_indices(repo_path):