Thread (75 messages) 75 messages, 5 authors, 10h ago
HOTtoday

[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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help