Re: [PATCH v2 1/4] revision: complicated pathspecs disable filters
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Apr 13, 2020, 16:09 UTC
- Message-ID
- <20200413160908.GD59601@syl.local>
- In-Reply-To
- <adc03eee4ac8a0911bfd2a7ae03364ef0e744ef0.1586789126.git.gitgitgadget@gmail.com>
On Mon, Apr 13, 2020 at 02:45:23PM +0000, Derrick Stolee via GitGitGadget wrote:
Show 69 quoted lines
> From: Derrick Stolee <dstolee@microsoft.com>
>
> The changed-path Bloom filters work only when we can compute an
> explicit Bloom filter key in advance. When a pathspec is given
> that allows case-insensitive checks or wildcard matching, we
> must disable the Bloom filter performance checks.
>
> By checking the pathspec in prepare_to_use_bloom_filters(), we
> avoid setting up the Bloom filter data and thus revert to the
> usual logic.
>
> Before this change, the following tests would fail*:
>
> t6004-rev-list-path-optim.sh (Tests 6-7)
> t6130-pathspec-noglob.sh (Tests 3-6)
> t6131-pathspec-icase.sh (Tests 3-5)
>
> *These tests would fail when using GIT_TEST_COMMIT_GRAPH and
> GIT_TEST_COMMIT_GRAPH_BLOOM_FILTERS except that the latter
> environment variable was not set up correctly to write the changed-
> path Bloom filters in the test suite. That will be fixed in the
> next change.
>
> Helped-by: Taylor Blau <me@ttaylorr.com>
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
> revision.c | 19 ++++++++++++++++++-
> 1 file changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/revision.c b/revision.c
> index 2b06ee739c8..f78c636e4d0 100644
> --- a/revision.c
> +++ b/revision.c
> @@ -650,6 +650,20 @@ static void trace2_bloom_filter_statistics_atexit(void)
> jw_release(&jw);
> }
>
> +static int forbid_bloom_filters(struct pathspec *spec)
> +{
> + if (spec->has_wildcard)
> + return 1;
> + if (spec->nr > 1)
> + return 1;
> + if (spec->magic & ~PATHSPEC_LITERAL)
> + return 1;
> + if (spec->nr && (spec->items[0].magic & ~PATHSPEC_LITERAL))
> + return 1;
> +
> + return 0;
> +}
> +
> static void prepare_to_use_bloom_filter(struct rev_info *revs)
> {
> struct pathspec_item *pi;
> @@ -659,7 +673,10 @@ static void prepare_to_use_bloom_filter(struct rev_info *revs)
> int len;
>
> if (!revs->commits)
> - return;
> + return;
> +
> + if (forbid_bloom_filters(&revs->prune_data))
> + return;
>
> repo_parse_commit(revs->repo, revs->commits->item);
>
> --
> gitgitgadget
>Nicely done, this looks good to me. Thanks.
Thanks, Taylor