Skip to content

Commit 3b89ff1

Browse files
committed
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
2 parents d4833b2 + 23c1e71 commit 3b89ff1

File tree

5 files changed

+51
-41
lines changed

5 files changed

+51
-41
lines changed

Documentation/config/feature.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ skipping more commits at a time, reducing the number of round trips.
1717
+
1818
* `pack.useBitmapBoundaryTraversal=true` may improve bitmap traversal times by
1919
walking fewer objects.
20+
+
21+
* `pack.allowPackReuse=multi` may improve the time it takes to create a pack by
22+
reusing objects from multiple packs instead of just one.
2023

2124
feature.manyFiles::
2225
Enable config options that optimize for repos with many files in the

builtin/pack-objects.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4396,6 +4396,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
43964396
prepare_repo_settings(the_repository);
43974397
if (sparse < 0)
43984398
sparse = the_repository->settings.pack_use_sparse;
4399+
if (the_repository->settings.pack_use_multi_pack_reuse)
4400+
allow_pack_reuse = MULTI_PACK_REUSE;
43994401
}
44004402

44014403
reset_pack_idx_option(&pack_idx_opts);

repo-settings.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void prepare_repo_settings(struct repository *r)
4343
if (experimental) {
4444
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
4545
r->settings.pack_use_bitmap_boundary_traversal = 1;
46+
r->settings.pack_use_multi_pack_reuse = 1;
4647
}
4748
if (manyfiles) {
4849
r->settings.index_version = 4;

repository.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct repo_settings {
3939
int sparse_index;
4040
int pack_read_reverse_index;
4141
int pack_use_bitmap_boundary_traversal;
42+
int pack_use_multi_pack_reuse;
4243

4344
/*
4445
* Does this repository have core.useReplaceRefs=true (on by

t/t5332-multi-pack-reuse.sh

Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,27 @@ pack_position () {
2424
grep "$1" objects | cut -d" " -f1
2525
}
2626

27+
# test_pack_objects_reused_all <pack-reused> <packs-reused>
28+
test_pack_objects_reused_all () {
29+
: >trace2.txt &&
30+
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
31+
git pack-objects --stdout --revs --all --delta-base-offset \
32+
>/dev/null &&
33+
34+
test_pack_reused "$1" <trace2.txt &&
35+
test_packs_reused "$2" <trace2.txt
36+
}
37+
38+
# test_pack_objects_reused <pack-reused> <packs-reused>
39+
test_pack_objects_reused () {
40+
: >trace2.txt &&
41+
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
42+
git pack-objects --stdout --revs >/dev/null &&
43+
44+
test_pack_reused "$1" <trace2.txt &&
45+
test_packs_reused "$2" <trace2.txt
46+
}
47+
2748
test_expect_success 'preferred pack is reused for single-pack reuse' '
2849
test_config pack.allowPackReuse single &&
2950
@@ -35,12 +56,24 @@ test_expect_success 'preferred pack is reused for single-pack reuse' '
3556
3657
git multi-pack-index write --bitmap &&
3758
38-
: >trace2.txt &&
39-
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
40-
git pack-objects --stdout --revs --all >/dev/null &&
59+
test_pack_objects_reused_all 3 1
60+
'
61+
62+
test_expect_success 'multi-pack reuse is disabled by default' '
63+
test_pack_objects_reused_all 3 1
64+
'
65+
66+
test_expect_success 'feature.experimental implies multi-pack reuse' '
67+
test_config feature.experimental true &&
68+
69+
test_pack_objects_reused_all 6 2
70+
'
71+
72+
test_expect_success 'multi-pack reuse can be disabled with feature.experimental' '
73+
test_config feature.experimental true &&
74+
test_config pack.allowPackReuse single &&
4175
42-
test_pack_reused 3 <trace2.txt &&
43-
test_packs_reused 1 <trace2.txt
76+
test_pack_objects_reused_all 3 1
4477
'
4578

4679
test_expect_success 'enable multi-pack reuse' '
@@ -58,21 +91,11 @@ test_expect_success 'reuse all objects from subset of bitmapped packs' '
5891
^$(git rev-parse A)
5992
EOF
6093
61-
: >trace2.txt &&
62-
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
63-
git pack-objects --stdout --revs <in >/dev/null &&
64-
65-
test_pack_reused 6 <trace2.txt &&
66-
test_packs_reused 2 <trace2.txt
94+
test_pack_objects_reused 6 2 <in
6795
'
6896

6997
test_expect_success 'reuse all objects from all packs' '
70-
: >trace2.txt &&
71-
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
72-
git pack-objects --stdout --revs --all >/dev/null &&
73-
74-
test_pack_reused 9 <trace2.txt &&
75-
test_packs_reused 3 <trace2.txt
98+
test_pack_objects_reused_all 9 3
7699
'
77100

78101
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' '
105128
^$(git rev-parse D)
106129
EOF
107130
108-
: >trace2.txt &&
109-
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
110-
git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
111-
112-
test_pack_reused 3 <trace2.txt &&
113-
test_packs_reused 1 <trace2.txt
131+
test_pack_objects_reused 3 1 <in
114132
'
115133

116134
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' '
126144
^$(git rev-parse D)
127145
EOF
128146
129-
: >trace2.txt &&
130-
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
131-
git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
132-
133-
test_pack_reused 3 <trace2.txt &&
134-
test_packs_reused 1 <trace2.txt
147+
test_pack_objects_reused 3 1 <in
135148
'
136149

137150
test_expect_success 'omit delta with uninteresting base (same pack)' '
@@ -161,10 +174,6 @@ test_expect_success 'omit delta with uninteresting base (same pack)' '
161174
^$base
162175
EOF
163176
164-
: >trace2.txt &&
165-
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
166-
git pack-objects --stdout --delta-base-offset --revs <in >/dev/null &&
167-
168177
# We can only reuse the 3 objects corresponding to "other" from
169178
# the latest pack.
170179
#
@@ -176,8 +185,7 @@ test_expect_success 'omit delta with uninteresting base (same pack)' '
176185
# The remaining objects from the other pack are similarly not
177186
# reused because their objects are on the uninteresting side of
178187
# the query.
179-
test_pack_reused 3 <trace2.txt &&
180-
test_packs_reused 1 <trace2.txt
188+
test_pack_objects_reused 3 1 <in
181189
'
182190

183191
test_expect_success 'omit delta from uninteresting base (cross pack)' '
@@ -190,15 +198,10 @@ test_expect_success 'omit delta from uninteresting base (cross pack)' '
190198
191199
git multi-pack-index write --bitmap --preferred-pack="pack-$P.idx" &&
192200
193-
: >trace2.txt &&
194-
GIT_TRACE2_EVENT="$PWD/trace2.txt" \
195-
git pack-objects --stdout --delta-base-offset --all >/dev/null &&
196-
197201
packs_nr="$(find $packdir -type f -name "pack-*.pack" | wc -l)" &&
198202
objects_nr="$(git rev-list --count --all --objects)" &&
199203
200-
test_pack_reused $(($objects_nr - 1)) <trace2.txt &&
201-
test_packs_reused $packs_nr <trace2.txt
204+
test_pack_objects_reused_all $(($objects_nr - 1)) $packs_nr
202205
'
203206

204207
test_done

0 commit comments

Comments
 (0)