On Fri, Sep 15, 2023 at 10:29:12PM +0200, SZEDER Gábor wrote: > On Mon, Sep 11, 2023 at 03:31:56PM -0700, Jonathan Tan wrote: > > SZEDER Gábor suggested [2] that we change the revision walk to read > > changed path filters also for root commits, but I don't think that's > > possible - we have to tie reading changed path filters to when we read > > trees, and right now, we don't seem to read trees when evaluating root > > commits (rev_compare_tree() in revision.c is in the only code path that > > uses changed path filters, and it itself is only called per-parent and > > thus not called for root commits). > > When encountering a root commit during a pathspec-limited revision > walk we call rev_same_tree_as_empty() instead of rev_compare_tree(). > All that's missing there is checking the Bloom filter and accounting > for false positives. I think that we'd want something like this, though I would definitely appreciate a second set of eyes since I am not 100% confident in my set of changes here: --- 8< --- diff --git a/revision.c b/revision.c index 2f4c53ea20..1d36df49e2 100644 --- a/revision.c +++ b/revision.c @@ -837,14 +837,24 @@ static int rev_compare_tree(struct rev_info *revs, static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit) { struct tree *t1 = repo_get_commit_tree(the_repository, commit); + int bloom_ret = 1; if (!t1) return 0; + if (revs->bloom_keys_nr) { + bloom_ret = check_maybe_different_in_bloom_filter(revs, commit); + if (!bloom_ret) + return 1; + } + tree_difference = REV_TREE_SAME; revs->pruning.flags.has_changes = 0; diff_tree_oid(NULL, &t1->object.oid, "", &revs->pruning); + if (bloom_ret == 1 && tree_difference == REV_TREE_SAME) + count_bloom_filter_false_positive++; + return tree_difference == REV_TREE_SAME; } diff --git a/t/t4216-log-bloom.sh b/t/t4216-log-bloom.sh index fa9d32facf..3a45cb997b 100755 --- a/t/t4216-log-bloom.sh +++ b/t/t4216-log-bloom.sh @@ -162,7 +162,7 @@ test_expect_success 'setup - add commit-graph to the chain with Bloom filters' ' test_bloom_filters_used_when_some_filters_are_missing () { log_args=$1 - bloom_trace_prefix="statistics:{\"filter_not_present\":3,\"maybe\":6,\"definitely_not\":9" + bloom_trace_prefix="statistics:{\"filter_not_present\":3,\"maybe\":6,\"definitely_not\":10" setup "$log_args" && grep -q "$bloom_trace_prefix" "$TRASH_DIRECTORY/trace.perf" && test_cmp log_wo_bloom log_w_bloom --- >8 --- Thanks, Taylor