Re: [PATCH v2 12/14] commit-graph: add large-filters bitmap chunk
- From
Taylor Blau <me@ttaylorr.com>
- Date
- Aug 5, 2020, 22:25 UTC
- Message-ID
- <20200805222531.GA30420@syl.lan>
- In-Reply-To
- <xmqqh7tgn37w.fsf@gitster.c.googlers.com>
On Wed, Aug 05, 2020 at 03:21:39PM -0700, Junio C Hamano wrote:
Show 72 quoted lines
> Taylor Blau <me@ttaylorr.com> writes:
>
> > On Wed, Aug 05, 2020 at 02:01:29PM -0700, Junio C Hamano wrote:
> >> Taylor Blau <me@ttaylorr.com> writes:
> >>
> >> > @@ -71,6 +72,10 @@ struct commit_graph {
> >> > const unsigned char *chunk_base_graphs;
> >> > const unsigned char *chunk_bloom_indexes;
> >> > const unsigned char *chunk_bloom_data;
> >> > + const unsigned char *chunk_bloom_large_filters;
> >> > +
> >> > + size_t bloom_large_to_alloc;
> >> > + struct bitmap bloom_large;
> >>
> >> Hmph, is the API rich enough to allow users to release the resource
> >> used by such an embedded bitmap? I ask becuase...
> >>
> >> > @@ -2503,6 +2577,7 @@ void free_commit_graph(struct commit_graph *g)
> >> > }
> >> > free(g->filename);
> >> > free(g->bloom_filter_settings);
> >> > + bitmap_free(g->bloom_large);
> >> > free(g);
> >> > }
> >>
> >> ... this hunk cannot be possibly correct as-is, and cannot be made
> >> correct without changing g->bloom_large to a pointer into a heap
> >> allocated bitmap, because bitmap_free() wants to not just release
> >> the resource held by the bitmap but the bitmap itself.
> >
> > Yuck, that's definitely wrong. Serves me right for sneaking this in
> > after I had run `git rebase -x 'make -j40 DEVELOPER=1 test'
> > upstream/master` ;-).
> >
> > Below the scissors line should do the trick. It should apply cleanly at
> > this point in the series, but it'll produce a compilation failure on the
> > very last patch (fixing it is straightforward and looks like the
> > following diff):
> >
> > diff --git a/bloom.c b/bloom.c
> > index d0c0fd049d..8d07209c6b 100644
> > --- a/bloom.c
> > +++ b/bloom.c
> > @@ -52,7 +52,7 @@ static int load_bloom_filter_from_graph(struct commit_graph *g,
> > start_index = 0;
> >
> > if ((start_index == end_index) &&
> > - (g->bloom_large.word_alloc && !bitmap_get(&g->bloom_large, lex_pos))) {
> > + (g->bloom_large && !bitmap_get(g->bloom_large, lex_pos))) {
> > /*
> > * If the filter is zero-length, either (1) the filter has no
> > * changes, (2) the filter has too many changes, or (3) it
> >
> > In either case, this will fix the bad free():
> >
> > --- >8 ---
> >
> > Subject: [PATCH] fixup! commit-graph: add large-filters bitmap chunk
> >
> > Signed-off-by: Taylor Blau <me@ttaylorr.com>
> > ---
> > commit-graph.c | 18 ++++++++++--------
> > commit-graph.h | 2 +-
> > 2 files changed, 11 insertions(+), 9 deletions(-)
> > ...
> > @@ -2360,6 +2361,7 @@ int write_commit_graph(struct object_directory *odb,
> > free(ctx->graph_name);
> > free(ctx->commits.list);
> > free(ctx->oids.list);
> > + free(ctx->bloom_large);
>
> Is this correct, or shouldn't it be bitmap_free() instead?Ack, that should be 'bitmap_free()'. Double checking, 'bitmap_free' does handle a 'NULL' argument like 'free', so dealing with an old commit-graph lacking this chunk will work fine.
Thanks for catching my mistake. I'm off tomorrow, Friday, and Monday, so my responses from now on may be intermittent, but I should have some time.
Thanks, Taylor