diff --git a/src/borg/testsuite/repository.py b/src/borg/testsuite/repository.py index 9c3183557..3a2d92368 100644 --- a/src/borg/testsuite/repository.py +++ b/src/borg/testsuite/repository.py @@ -792,6 +792,46 @@ def test_crash_before_compact(self): self.assert_equal(self.repository.get(H(0)), b'data2') +class RepositoryHintsTestCase(RepositoryTestCaseBase): + + def test_hints_persistence(self): + self.repository.put(H(0), b'data') + self.repository.delete(H(0)) + self.repository.commit(compact=False) + shadow_index_expected = self.repository.shadow_index + compact_expected = self.repository.compact + segments_expected = self.repository.segments + # close and re-open the repository (create fresh Repository instance) to + # check whether hints were persisted to / reloaded from disk + self.reopen() + with self.repository: + # see also do_compact() + self.repository.put(H(42), b'foobar') # this will call prepare_txn() and load the hints data + # check if hints persistence worked: + self.assert_equal(shadow_index_expected, self.repository.shadow_index) + self.assert_equal(compact_expected, self.repository.compact) + del self.repository.segments[2] # ignore the segment created by put(H(42), ...) + self.assert_equal(segments_expected, self.repository.segments) + + def test_hints_behaviour(self): + self.repository.put(H(0), b'data') + self.assert_equal(self.repository.shadow_index, {}) + self.assert_true(len(self.repository.compact) == 0) + self.repository.delete(H(0)) + self.repository.commit(compact=False) + # now there should be an entry for H(0) in shadow_index + self.assert_in(H(0), self.repository.shadow_index) + self.assert_equal(len(self.repository.shadow_index[H(0)]), 1) + self.assert_in(0, self.repository.compact) # segment 0 can be compacted + self.repository.put(H(42), b'foobar') # see also do_compact() + self.repository.commit(compact=True, threshold=0.0) # compact completely! + # nothing to compact any more! no info left about stuff that does not exist any more: + self.assert_equal(self.repository.shadow_index[H(0)], []) + # segment 0 was compacted away, no info about it left: + self.assert_not_in(0, self.repository.compact) + self.assert_not_in(0, self.repository.segments) + + class RemoteRepositoryTestCase(RepositoryTestCase): repository = None # type: RemoteRepository