]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'tb/multi-pack-reuse-experiment'
authorJunio C Hamano <gitster@pobox.com>
Mon, 12 Feb 2024 21:16:11 +0000 (13:16 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Feb 2024 21:16:11 +0000 (13:16 -0800)
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

Documentation/config/feature.txt
builtin/pack-objects.c
repo-settings.c
repository.h
t/t5332-multi-pack-reuse.sh

index bf9546fca4f693f01b39252d12def7df9b51a52f..f061b64b7484497a43fba7aaac67c7f84b012582 100644 (file)
@@ -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
index d8c2128a97928229e93212461027b700d219ec6a..329aeac80437502a49b48fe5383aa40e90cd16c3 100644 (file)
@@ -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);
index 30cd4787627b7cacbc2dbceddc0babee1b72cb3e..a0b590bc6c0bb927fb0846055f4c4826e9558c80 100644 (file)
@@ -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;
index 7a250a6605cc8e5a3ae661584122bf1f90f16747..21949c5a17f68c8cff53abd3abe815d8c5e2c643 100644 (file)
@@ -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
index 99145327a6a21f733a5a6fcbd5ccafb1b4259088..3c20738bcebd82c2f9f8fa0d728c39bfe6ac525e 100755 (executable)
@@ -24,6 +24,27 @@ pack_position () {
        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_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 &&
 
-       : >trace2.txt &&
-       GIT_TRACE2_EVENT="$PWD/trace2.txt" \
-               git pack-objects --stdout --revs --all >/dev/null &&
+       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_reused 3 <trace2.txt &&
-       test_packs_reused 1 <trace2.txt
+       test_pack_objects_reused_all 3 1
 '
 
 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)
        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_pack_objects_reused 6 2 <in
 '
 
 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_pack_objects_reused_all 9 3
 '
 
 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)
        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_pack_objects_reused 3 1 <in
 '
 
 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)
        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_pack_objects_reused 3 1 <in
 '
 
 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
        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.
        #
@@ -176,8 +185,7 @@ test_expect_success 'omit delta with uninteresting base (same pack)' '
        # 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_pack_objects_reused 3 1 <in
 '
 
 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" &&
 
-       : >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_pack_objects_reused_all $(($objects_nr - 1)) $packs_nr
 '
 
 test_done