[PATCH v2 4/7] commit-reach: add trace2 instrumentation to paint_down_to_common()
From: Kristofer Karlsson via GitGitGadget <hidden>
Date: 2026-06-24 12:14:24
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Kristofer Karlsson <redacted> 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_PERF. This provides a way to measure the impact of future optimizations without relying on wall-clock benchmarks alone. Signed-off-by: Kristofer Karlsson <redacted> --- commit-reach.c | 5 +++++ t/t6600-test-reach.sh | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+)
diff --git a/commit-reach.c b/commit-reach.c
index a9483759e0..f6a438550b 100644
--- a/commit-reach.c
+++ b/commit-reach.c@@ -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)
@@ -112,6 +113,7 @@ static int paint_down_to_common(struct repository *r, { compare_commits_by_gen_then_commit_date } }; int i; + int steps = 0; timestamp_t last_gen = GENERATION_NUMBER_INFINITY; struct commit_list **tail = result;
@@ -135,6 +137,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",
@@ -190,6 +193,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; }
diff --git a/t/t6600-test-reach.sh b/t/t6600-test-reach.sh
index 4b771b4c58..c1109fb42f 100755
--- a/t/t6600-test-reach.sh
+++ b/t/t6600-test-reach.sh@@ -319,6 +319,27 @@ test_expect_success 'get_merge_bases_many:mixed-finite-infinity' ' test_all_modes get_merge_bases_many ' +test_expect_success 'merge-base --all commit-walk steps' ' + test_when_finished rm -rf .git/objects/info/commit-graph \ + .git/objects/info/commit-graphs && + rm -rf .git/objects/info/commit-graph \ + .git/objects/info/commit-graphs && + + GIT_TRACE2_EVENT="$(pwd)/trace-none.txt" \ + git merge-base --all commit-9-9 commit-9-1 >actual && + test_trace2_data paint_down_to_common steps 81 <trace-none.txt && + + cp commit-graph-full .git/objects/info/commit-graph && + GIT_TRACE2_EVENT="$(pwd)/trace-full.txt" \ + git merge-base --all commit-9-9 commit-9-1 >actual && + test_trace2_data paint_down_to_common steps 80 <trace-full.txt && + + cp commit-graph-half .git/objects/info/commit-graph && + GIT_TRACE2_EVENT="$(pwd)/trace-half.txt" \ + git merge-base --all commit-9-9 commit-9-1 >actual && + test_trace2_data paint_down_to_common steps 81 <trace-half.txt +' + test_expect_success 'reduce_heads' ' cat >input <<-\EOF && X:commit-1-10
--
gitgitgadget