Merge branch 'tb/multi-pack-reuse-experiment'
Setting `feature.experimental` opts the user into multi-pack reuse experiment * tb/multi-pack-reuse-experiment: pack-objects: enable multi-pack reuse via `feature.experimental` t5332-multi-pack-reuse.sh: extract pack-objects helper functions
This commit is contained in:
@ -17,6 +17,9 @@ skipping more commits at a time, reducing the number of round trips.
|
|||||||
+
|
+
|
||||||
* `pack.useBitmapBoundaryTraversal=true` may improve bitmap traversal times by
|
* `pack.useBitmapBoundaryTraversal=true` may improve bitmap traversal times by
|
||||||
walking fewer objects.
|
walking fewer objects.
|
||||||
|
+
|
||||||
|
* `pack.allowPackReuse=multi` may improve the time it takes to create a pack by
|
||||||
|
reusing objects from multiple packs instead of just one.
|
||||||
|
|
||||||
feature.manyFiles::
|
feature.manyFiles::
|
||||||
Enable config options that optimize for repos with many files in the
|
Enable config options that optimize for repos with many files in the
|
||||||
|
@ -4396,6 +4396,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
|||||||
prepare_repo_settings(the_repository);
|
prepare_repo_settings(the_repository);
|
||||||
if (sparse < 0)
|
if (sparse < 0)
|
||||||
sparse = the_repository->settings.pack_use_sparse;
|
sparse = the_repository->settings.pack_use_sparse;
|
||||||
|
if (the_repository->settings.pack_use_multi_pack_reuse)
|
||||||
|
allow_pack_reuse = MULTI_PACK_REUSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
reset_pack_idx_option(&pack_idx_opts);
|
reset_pack_idx_option(&pack_idx_opts);
|
||||||
|
@ -43,6 +43,7 @@ void prepare_repo_settings(struct repository *r)
|
|||||||
if (experimental) {
|
if (experimental) {
|
||||||
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
|
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
|
||||||
r->settings.pack_use_bitmap_boundary_traversal = 1;
|
r->settings.pack_use_bitmap_boundary_traversal = 1;
|
||||||
|
r->settings.pack_use_multi_pack_reuse = 1;
|
||||||
}
|
}
|
||||||
if (manyfiles) {
|
if (manyfiles) {
|
||||||
r->settings.index_version = 4;
|
r->settings.index_version = 4;
|
||||||
|
@ -39,6 +39,7 @@ struct repo_settings {
|
|||||||
int sparse_index;
|
int sparse_index;
|
||||||
int pack_read_reverse_index;
|
int pack_read_reverse_index;
|
||||||
int pack_use_bitmap_boundary_traversal;
|
int pack_use_bitmap_boundary_traversal;
|
||||||
|
int pack_use_multi_pack_reuse;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Does this repository have core.useReplaceRefs=true (on by
|
* Does this repository have core.useReplaceRefs=true (on by
|
||||||
|
@ -24,6 +24,27 @@ pack_position () {
|
|||||||
grep "$1" objects | cut -d" " -f1
|
grep "$1" objects | cut -d" " -f1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# test_pack_objects_reused_all <pack-reused> <packs-reused>
|
||||||
|
test_pack_objects_reused_all () {
|
||||||
|
: >trace2.txt &&
|
||||||
|
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
|
||||||
|
git pack-objects --stdout --revs --all --delta-base-offset \
|
||||||
|
>/dev/null &&
|
||||||
|
|
||||||
|
test_pack_reused "$1" <trace2.txt &&
|
||||||
|
test_packs_reused "$2" <trace2.txt
|
||||||
|
}
|
||||||
|
|
||||||
|
# test_pack_objects_reused <pack-reused> <packs-reused>
|
||||||
|
test_pack_objects_reused () {
|
||||||
|
: >trace2.txt &&
|
||||||
|
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
|
||||||
|
git pack-objects --stdout --revs >/dev/null &&
|
||||||
|
|
||||||
|
test_pack_reused "$1" <trace2.txt &&
|
||||||
|
test_packs_reused "$2" <trace2.txt
|
||||||
|
}
|
||||||
|
|
||||||
test_expect_success 'preferred pack is reused for single-pack reuse' '
|
test_expect_success 'preferred pack is reused for single-pack reuse' '
|
||||||
test_config pack.allowPackReuse single &&
|
test_config pack.allowPackReuse single &&
|
||||||
|
|
||||||
@ -35,12 +56,24 @@ test_expect_success 'preferred pack is reused for single-pack reuse' '
|
|||||||
|
|
||||||
git multi-pack-index write --bitmap &&
|
git multi-pack-index write --bitmap &&
|
||||||
|
|
||||||
: >trace2.txt &&
|
test_pack_objects_reused_all 3 1
|
||||||
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
|
'
|
||||||
git pack-objects --stdout --revs --all >/dev/null &&
|
|
||||||
|
|
||||||
test_pack_reused 3 <trace2.txt &&
|
test_expect_success 'multi-pack reuse is disabled by default' '
|
||||||
test_packs_reused 1 <trace2.txt
|
test_pack_objects_reused_all 3 1
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'feature.experimental implies multi-pack reuse' '
|
||||||
|
test_config feature.experimental true &&
|
||||||
|
|
||||||
|
test_pack_objects_reused_all 6 2
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'multi-pack reuse can be disabled with feature.experimental' '
|
||||||
|
test_config feature.experimental true &&
|
||||||
|
test_config pack.allowPackReuse single &&
|
||||||
|
|
||||||
|
test_pack_objects_reused_all 3 1
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'enable multi-pack reuse' '
|
test_expect_success 'enable multi-pack reuse' '
|
||||||
@ -58,21 +91,11 @@ test_expect_success 'reuse all objects from subset of bitmapped packs' '
|
|||||||
^$(git rev-parse A)
|
^$(git rev-parse A)
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
: >trace2.txt &&
|
test_pack_objects_reused 6 2 <in
|
||||||
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' '
|
test_expect_success 'reuse all objects from all packs' '
|
||||||
: >trace2.txt &&
|
test_pack_objects_reused_all 9 3
|
||||||
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' '
|
test_expect_success 'reuse objects from first pack with middle gap' '
|
||||||
@ -105,12 +128,7 @@ test_expect_success 'reuse objects from first pack with middle gap' '
|
|||||||
^$(git rev-parse D)
|
^$(git rev-parse D)
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
: >trace2.txt &&
|
test_pack_objects_reused 3 1 <in
|
||||||
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' '
|
test_expect_success 'reuse objects from middle pack with middle gap' '
|
||||||
@ -126,12 +144,7 @@ test_expect_success 'reuse objects from middle pack with middle gap' '
|
|||||||
^$(git rev-parse D)
|
^$(git rev-parse D)
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
: >trace2.txt &&
|
test_pack_objects_reused 3 1 <in
|
||||||
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)' '
|
test_expect_success 'omit delta with uninteresting base (same pack)' '
|
||||||
@ -161,10 +174,6 @@ test_expect_success 'omit delta with uninteresting base (same pack)' '
|
|||||||
^$base
|
^$base
|
||||||
EOF
|
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
|
# We can only reuse the 3 objects corresponding to "other" from
|
||||||
# the latest pack.
|
# the latest pack.
|
||||||
#
|
#
|
||||||
@ -176,8 +185,7 @@ test_expect_success 'omit delta with uninteresting base (same pack)' '
|
|||||||
# The remaining objects from the other pack are similarly not
|
# The remaining objects from the other pack are similarly not
|
||||||
# reused because their objects are on the uninteresting side of
|
# reused because their objects are on the uninteresting side of
|
||||||
# the query.
|
# the query.
|
||||||
test_pack_reused 3 <trace2.txt &&
|
test_pack_objects_reused 3 1 <in
|
||||||
test_packs_reused 1 <trace2.txt
|
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'omit delta from uninteresting base (cross pack)' '
|
test_expect_success 'omit delta from uninteresting base (cross pack)' '
|
||||||
@ -190,15 +198,10 @@ test_expect_success 'omit delta from uninteresting base (cross pack)' '
|
|||||||
|
|
||||||
git multi-pack-index write --bitmap --preferred-pack="pack-$P.idx" &&
|
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)" &&
|
packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" &&
|
||||||
objects_nr="$(git rev-list --count --all --objects)" &&
|
objects_nr="$(git rev-list --count --all --objects)" &&
|
||||||
|
|
||||||
test_pack_reused $(($objects_nr - 1)) <trace2.txt &&
|
test_pack_objects_reused_all $(($objects_nr - 1)) $packs_nr
|
||||||
test_packs_reused $packs_nr <trace2.txt
|
|
||||||
'
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user