Skip to content

Commit

Permalink
pack-objects: enable multi-pack reuse via feature.experimental
Browse files Browse the repository at this point in the history
Now that multi-pack reuse is supported, enable it via the
feature.experimental configuration in addition to the classic
`pack.allowPackReuse`.

This will allow more users to experiment with the new behavior who might
not otherwise be aware of the existing `pack.allowPackReuse`
configuration option.

The enum with values NO_PACK_REUSE, SINGLE_PACK_REUSE, and
MULTI_PACK_REUSE is defined statically in builtin/pack-objects.c's
compilation unit. We could hoist that enum into a scope visible from the
repository_settings struct, and then use that enum value in
pack-objects. Instead, define a single int that indicates what
pack-objects's default value should be to avoid additional unnecessary
code movement.

Though `feature.experimental` implies `pack.allowPackReuse=multi`, this
can still be overridden by explicitly setting the latter configuration
to either "single" or "false". Tests covering all of these cases are
showin t5332.

Signed-off-by: Taylor Blau <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
ttaylorr authored and gitster committed Feb 5, 2024
1 parent 7c01878 commit 23c1e71
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Documentation/config/feature.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
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::
Enable config options that optimize for repos with many files in the
Expand Down
2 changes: 2 additions & 0 deletions builtin/pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -4396,6 +4396,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
prepare_repo_settings(the_repository);
if (sparse < 0)
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);
Expand Down
1 change: 1 addition & 0 deletions repo-settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ void prepare_repo_settings(struct repository *r)
if (experimental) {
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_SKIPPING;
r->settings.pack_use_bitmap_boundary_traversal = 1;
r->settings.pack_use_multi_pack_reuse = 1;
}
if (manyfiles) {
r->settings.index_version = 4;
Expand Down
1 change: 1 addition & 0 deletions repository.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ struct repo_settings {
int sparse_index;
int pack_read_reverse_index;
int pack_use_bitmap_boundary_traversal;
int pack_use_multi_pack_reuse;

/*
* Does this repository have core.useReplaceRefs=true (on by
Expand Down
16 changes: 16 additions & 0 deletions t/t5332-multi-pack-reuse.sh
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,22 @@ test_expect_success 'preferred pack is reused for single-pack reuse' '
test_pack_objects_reused_all 3 1
'

test_expect_success 'multi-pack reuse is disabled by default' '
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' '
git config pack.allowPackReuse multi
Expand Down

0 comments on commit 23c1e71

Please sign in to comment.