瀏覽代碼

Merge pull request #7897 from ThomasWaldmann/check-fixes-shadow-index-1.2

check --repair fixes shadow_index (1.2-maint)
TW 1 年之前
父節點
當前提交
55ee4e2d28
共有 2 個文件被更改,包括 11 次插入0 次删除
  1. 2 0
      src/borg/repository.py
  2. 9 0
      src/borg/testsuite/repository.py

+ 2 - 0
src/borg/repository.py

@@ -917,6 +917,7 @@ class Repository:
                     s, _ = self.index[key]
                     self.compact[s] += size
                     self.segments[s] -= 1
+                    self.shadow_index.setdefault(key, []).append(s)
                 except KeyError:
                     pass
                 self.index[key] = segment, offset
@@ -935,6 +936,7 @@ class Repository:
                         self.segments[s] -= 1
                         size = self.io.read(s, offset, key, read_data=False)
                         self.compact[s] += size
+                        self.shadow_index.setdefault(key, []).append(s)
             elif tag == TAG_COMMIT:
                 continue
             else:

+ 9 - 0
src/borg/testsuite/repository.py

@@ -826,6 +826,15 @@ class RepositoryHintsTestCase(RepositoryTestCaseBase):
         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)
+        self.reopen()
+        self.assert_equal(self.repository.check(repair=True), True)
+        self.reopen()
+        self.repository.put(H(42), b'foobar')  # this will call prepare_txn() and load the hints data
+        self.assert_equal(shadow_index_expected, self.repository.shadow_index)
+        # sizes do not match, with vs. without header?
+        # 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')