]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-reach: add trace2 instrumentation to paint_down_to_common()
authorKristofer Karlsson <krka@spotify.com>
Sat, 11 Jul 2026 13:27:40 +0000 (13:27 +0000)
committerJunio C Hamano <gitster@pobox.com>
Sat, 11 Jul 2026 21:00:11 +0000 (14:00 -0700)
Add a step counter and trace2_data_intmax() call so that the number
of commits visited during the paint walk is observable via
GIT_TRACE2_EVENT. This provides a way to measure the impact of
future optimizations without relying on wall-clock benchmarks alone.

Signed-off-by: Kristofer Karlsson <krka@spotify.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit-reach.c
t/t6600-test-reach.sh

index bbf8c3eff068f6c4a750440b58c4791bf2d93e75..34e588f7c068e31fdf57e79bbdf3ed8b7964aad3 100644 (file)
@@ -11,6 +11,7 @@
 #include "tag.h"
 #include "commit-reach.h"
 #include "ewah/ewok.h"
+#include "trace2.h"
 
 /* Remember to update object flag allocation in object.h */
 #define PARENT1                (1u<<16)
@@ -113,6 +114,7 @@ static int paint_down_to_common(struct repository *r,
        };
        int i;
        int gen_ordered = 1;
+       int steps = 0;
        timestamp_t last_gen = GENERATION_NUMBER_INFINITY;
        struct commit_list **tail = result;
 
@@ -138,6 +140,7 @@ static int paint_down_to_common(struct repository *r,
                struct commit_list *parents;
                int flags;
                timestamp_t generation = commit_graph_generation(commit);
+               steps++;
 
                if (min_generation && generation > last_gen)
                        BUG("bad generation skip %"PRItime" > %"PRItime" at %s",
@@ -194,6 +197,8 @@ static int paint_down_to_common(struct repository *r,
        }
 
        clear_nonstale_queue(&queue);
+       trace2_data_intmax("paint_down_to_common", r,
+                          "steps", steps);
        commit_list_sort_by_date(result);
        return 0;
 }
index 27db83eb5a8702c05cb4c16c884701f196408b9e..574777d809fe9fbdf091e85b91dcd00cabb0e7b2 100755 (executable)
@@ -153,24 +153,34 @@ test_expect_success 'setup' '
 '
 
 run_all_modes () {
-       test_when_finished rm -rf .git/objects/info/commit-graph &&
-       "$@" <input >actual &&
-       test_cmp expect actual &&
-       cp commit-graph-full .git/objects/info/commit-graph &&
-       "$@" <input >actual &&
-       test_cmp expect actual &&
-       cp commit-graph-half .git/objects/info/commit-graph &&
-       "$@" <input >actual &&
-       test_cmp expect actual &&
-       cp commit-graph-no-gdat .git/objects/info/commit-graph &&
-       "$@" <input >actual &&
-       test_cmp expect actual
+       graph=.git/objects/info/commit-graph &&
+       test_when_finished rm -rf "$graph" "${graph}s" &&
+       rm -f trace-mode-*.txt &&
+
+       for mode in none full half no-gdat
+       do
+               rm -rf "$graph" "${graph}s" &&
+               cp "commit-graph-${mode}" "$graph" 2>/dev/null ||
+               true &&
+               GIT_TRACE2_EVENT="$(pwd)/trace-mode-${mode}.txt" \
+                       "$@" <input >actual &&
+               test_cmp expect actual || return 1
+       done
 }
 
 test_all_modes () {
        run_all_modes test-tool reach "$@"
 }
 
+test_paint_down_steps () {
+       for mode in none full half no-gdat
+       do
+               test_trace2_data_singular paint_down_to_common steps "$1" \
+                       "mode=$mode" <"trace-mode-${mode}.txt" || return 1
+               shift
+       done
+}
+
 test_expect_success 'ref_newer:miss' '
        cat >input <<-\EOF &&
        A:commit-5-7
@@ -244,7 +254,8 @@ test_expect_success 'in_merge_bases_many:self' '
        X:commit-6-8
        EOF
        echo "in_merge_bases_many(A,X):1" >expect &&
-       test_all_modes in_merge_bases_many
+       test_all_modes in_merge_bases_many &&
+       test_paint_down_steps 45 2 25 3
 '
 
 test_expect_success 'is_descendant_of:hit' '
@@ -329,6 +340,13 @@ test_expect_success 'get_merge_bases_many:infinity-both-sides' '
        test_all_modes get_merge_bases_many
 '
 
+test_expect_success 'merge-base --all commit-walk steps' '
+       >input &&
+       git rev-parse commit-9-1 >expect &&
+       run_all_modes git merge-base --all commit-9-9 commit-9-1 &&
+       test_paint_down_steps 81 80 81 81
+'
+
 test_expect_success 'reduce_heads' '
        cat >input <<-\EOF &&
        X:commit-1-10