]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'tb/idx-midx-race-fix'
authorJunio C Hamano <gitster@pobox.com>
Tue, 8 Dec 2020 23:11:18 +0000 (15:11 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 Dec 2020 23:11:18 +0000 (15:11 -0800)
Processes that access packdata while the .idx file gets removed
(e.g. while repacking) did not fail or fall back gracefully as they
could.

* tb/idx-midx-race-fix:
  midx.c: protect against disappearing packs
  packfile.c: protect against disappearing indexes

1  2 
midx.c
packfile.c
t/t5319-multi-pack-index.sh

diff --cc midx.c
Simple merge
diff --cc packfile.c
Simple merge
index ace469c95c2faaf91798639ab3d686d1637f7352,27c7eb906aed6dc05e32af82e485b53b73dbdeaa..297de502a94fdfc255e9e3de4db801e2f15d02f2
@@@ -738,21 -547,30 +738,47 @@@ test_expect_success 'repack --batch-siz
        )
  '
  
 +test_expect_success 'repack --batch-size=<large> repacks everything' '
 +      (
 +              cd dup2 &&
 +              rm .git/objects/pack/*.keep &&
 +              ls .git/objects/pack/*idx >idx-list &&
 +              test_line_count = 2 idx-list &&
 +              git multi-pack-index repack --batch-size=2000000 &&
 +              ls .git/objects/pack/*idx >idx-list &&
 +              test_line_count = 3 idx-list &&
 +              test-tool read-midx .git/objects | grep idx >midx-list &&
 +              test_line_count = 3 midx-list &&
 +              git multi-pack-index expire &&
 +              ls -al .git/objects/pack/*idx >idx-list &&
 +              test_line_count = 1 idx-list
 +      )
 +'
 +
+ test_expect_success 'load reverse index when missing .idx, .pack' '
+       git init repo &&
+       test_when_finished "rm -fr repo" &&
+       (
+               cd repo &&
+               git config core.multiPackIndex true &&
+               test_commit base &&
+               git repack -ad &&
+               git multi-pack-index write &&
+               git rev-parse HEAD >tip &&
+               pack=$(ls .git/objects/pack/pack-*.pack) &&
+               idx=$(ls .git/objects/pack/pack-*.idx) &&
+               mv $idx $idx.bak &&
+               git cat-file --batch-check="%(objectsize:disk)" <tip &&
+               mv $idx.bak $idx &&
+               mv $pack $pack.bak &&
+               git cat-file --batch-check="%(objectsize:disk)" <tip
+       )
+ '
  test_done