-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
pack-bitmap: enable reuse from all bitmapped packs
Now that both the pack-bitmap and pack-objects code are prepared to handle marking and using objects from multiple bitmapped packs for verbatim reuse, allow marking objects from all bitmapped packs as eligible for reuse. Within the `reuse_partial_packfile_from_bitmap()` function, we no longer only mark the pack whose first object is at bit position zero for reuse, and instead mark any pack contained in the MIDX as a reuse candidate. Provide a handful of test cases in a new script (t5332) exercising interesting behavior for multi-pack reuse to ensure that we performed all of the previous steps correctly. Signed-off-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
- Loading branch information
Showing
5 changed files
with
245 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,203 @@ | ||
#!/bin/sh | ||
|
||
test_description='pack-objects multi-pack reuse' | ||
|
||
. ./test-lib.sh | ||
. "$TEST_DIRECTORY"/lib-bitmap.sh | ||
|
||
objdir=.git/objects | ||
packdir=$objdir/pack | ||
|
||
test_pack_reused () { | ||
test_trace2_data pack-objects pack-reused "$1" | ||
} | ||
|
||
test_packs_reused () { | ||
test_trace2_data pack-objects packs-reused "$1" | ||
} | ||
|
||
|
||
# pack_position <object> </path/to/pack.idx | ||
pack_position () { | ||
git show-index >objects && | ||
grep "$1" objects | cut -d" " -f1 | ||
} | ||
|
||
test_expect_success 'preferred pack is reused for single-pack reuse' ' | ||
test_config pack.allowPackReuse single && | ||
for i in A B | ||
do | ||
test_commit "$i" && | ||
git repack -d || return 1 | ||
done && | ||
git multi-pack-index write --bitmap && | ||
: >trace2.txt && | ||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | ||
git pack-objects --stdout --revs --all >/dev/null && | ||
test_pack_reused 3 <trace2.txt && | ||
test_packs_reused 1 <trace2.txt | ||
' | ||
|
||
test_expect_success 'enable multi-pack reuse' ' | ||
git config pack.allowPackReuse multi | ||
' | ||
|
||
test_expect_success 'reuse all objects from subset of bitmapped packs' ' | ||
test_commit C && | ||
git repack -d && | ||
git multi-pack-index write --bitmap && | ||
cat >in <<-EOF && | ||
$(git rev-parse C) | ||
^$(git rev-parse A) | ||
EOF | ||
: >trace2.txt && | ||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | ||
git pack-objects --stdout --revs <in >/dev/null && | ||
test_pack_reused 6 <trace2.txt && | ||
test_packs_reused 2 <trace2.txt | ||
' | ||
|
||
test_expect_success 'reuse all objects from all packs' ' | ||
: >trace2.txt && | ||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | ||
git pack-objects --stdout --revs --all >/dev/null && | ||
test_pack_reused 9 <trace2.txt && | ||
test_packs_reused 3 <trace2.txt | ||
' | ||
|
||
test_expect_success 'reuse objects from first pack with middle gap' ' | ||
for i in D E F | ||
do | ||
test_commit "$i" || return 1 | ||
done && | ||
# Set "pack.window" to zero to ensure that we do not create any | ||
# deltas, which could alter the amount of pack reuse we perform | ||
# (if, for e.g., we are not sending one or more bases). | ||
D="$(git -c pack.window=0 pack-objects --all --unpacked $packdir/pack)" && | ||
d_pos="$(pack_position $(git rev-parse D) <$packdir/pack-$D.idx)" && | ||
e_pos="$(pack_position $(git rev-parse E) <$packdir/pack-$D.idx)" && | ||
f_pos="$(pack_position $(git rev-parse F) <$packdir/pack-$D.idx)" && | ||
# commits F, E, and D, should appear in that order at the | ||
# beginning of the pack | ||
test $f_pos -lt $e_pos && | ||
test $e_pos -lt $d_pos && | ||
# Ensure that the pack we are constructing sorts ahead of any | ||
# other packs in lexical/bitmap order by choosing it as the | ||
# preferred pack. | ||
git multi-pack-index write --bitmap --preferred-pack="pack-$D.idx" && | ||
cat >in <<-EOF && | ||
$(git rev-parse E) | ||
^$(git rev-parse D) | ||
EOF | ||
: >trace2.txt && | ||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | ||
git pack-objects --stdout --delta-base-offset --revs <in >/dev/null && | ||
test_pack_reused 3 <trace2.txt && | ||
test_packs_reused 1 <trace2.txt | ||
' | ||
|
||
test_expect_success 'reuse objects from middle pack with middle gap' ' | ||
rm -fr $packdir/multi-pack-index* && | ||
# Ensure that the pack we are constructing sort into any | ||
# position *but* the first one, by choosing a different pack as | ||
# the preferred one. | ||
git multi-pack-index write --bitmap --preferred-pack="pack-$A.idx" && | ||
cat >in <<-EOF && | ||
$(git rev-parse E) | ||
^$(git rev-parse D) | ||
EOF | ||
: >trace2.txt && | ||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | ||
git pack-objects --stdout --delta-base-offset --revs <in >/dev/null && | ||
test_pack_reused 3 <trace2.txt && | ||
test_packs_reused 1 <trace2.txt | ||
' | ||
|
||
test_expect_success 'omit delta with uninteresting base (same pack)' ' | ||
git repack -adk && | ||
test_seq 32 >f && | ||
git add f && | ||
test_tick && | ||
git commit -m "delta" && | ||
delta="$(git rev-parse HEAD)" && | ||
test_seq 64 >f && | ||
test_tick && | ||
git commit -a -m "base" && | ||
base="$(git rev-parse HEAD)" && | ||
test_commit other && | ||
git repack -d && | ||
have_delta "$(git rev-parse $delta:f)" "$(git rev-parse $base:f)" && | ||
git multi-pack-index write --bitmap && | ||
cat >in <<-EOF && | ||
$(git rev-parse other) | ||
^$base | ||
EOF | ||
: >trace2.txt && | ||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | ||
git pack-objects --stdout --delta-base-offset --revs <in >/dev/null && | ||
# We can only reuse the 3 objects corresponding to "other" from | ||
# the latest pack. | ||
# | ||
# This is because even though we want "delta", we do not want | ||
# "base", meaning that we have to inflate the delta/base-pair | ||
# corresponding to the blob in commit "delta", which bypasses | ||
# the pack-reuse mechanism. | ||
# | ||
# The remaining objects from the other pack are similarly not | ||
# reused because their objects are on the uninteresting side of | ||
# the query. | ||
test_pack_reused 3 <trace2.txt && | ||
test_packs_reused 1 <trace2.txt | ||
' | ||
|
||
test_expect_success 'omit delta from uninteresting base (cross pack)' ' | ||
cat >in <<-EOF && | ||
$(git rev-parse $base) | ||
^$(git rev-parse $delta) | ||
EOF | ||
P="$(git pack-objects --revs $packdir/pack <in)" && | ||
git multi-pack-index write --bitmap --preferred-pack="pack-$P.idx" && | ||
: >trace2.txt && | ||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \ | ||
git pack-objects --stdout --delta-base-offset --all >/dev/null && | ||
packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" && | ||
objects_nr="$(git rev-list --count --all --objects)" && | ||
test_pack_reused $(($objects_nr - 1)) <trace2.txt && | ||
test_packs_reused $packs_nr <trace2.txt | ||
' | ||
|
||
test_done |