Re: [PATCH v5 4/6] pack-bitmap: prepare to read lookup table extension
- From
Abhradeep Chakraborty <chakrabortyabhradeep79@gmail.com>
- Date
- Jul 26, 2022, 18:56 UTC
- Message-ID
- <CAPOJW5y74tj89OxJg0zSY90J2K5TG57ztGQq_8_LQ_DDxMQBGA@mail.gmail.com>
- In-Reply-To
- <Yt8/zl/uOLRBRS4h@nand.local>
On Tue, Jul 26, 2022 at 6:43 AM Taylor Blau <me@ttaylorr.com> wrote:
Show 10 quoted lines
> Just noticing this now, but I wonder if we could avoid incrementing `p` > here and instead write something like: > > triplet->commit_pos = get_be32(p); > triplet->offset = get_be64(p + sizeof(uint32_t)); > triplet->xor_row = get_be64(p + sizeof(uint64_t) + sizeof(uint32_t)); > > I don't have a strong feeling about it, though, it just seems to read a > little more directly to me and avoid modifying a variable that is only > going to live as long as the function executes (p).
Ok, will update.
Show 25 quoted lines
> > +/*
> > + * This function gets the raw triplet from `row`'th row in the
> > + * lookup table and fills that data to the `triplet`.
> > + */
> > +static int lookup_table_get_triplet(struct bitmap_index *bitmap_git,
> > + uint32_t pos,
> > + struct bitmap_lookup_table_triplet *triplet)
> > +{
> > + unsigned char *p = NULL;
> > + if (pos >= bitmap_git->entry_count)
> > + return error(_("corrupt bitmap lookup table: triplet position out of index"));
> > +
> > + p = bitmap_git->table_lookup + st_mult(pos, BITMAP_LOOKUP_TABLE_TRIPLET_WIDTH);
> > +
> > + return lookup_table_get_triplet_by_pointer(triplet, p);
> > +}
>
> Very nice. This cleans things up nicely by being able to call
> lookup_table_get_triplet_by_pointer().
>
> Since these are static functions, it doesn't really matter whether or
> not they are prefixed with 'bitmap_', since they won't be visible
> outside of pack-bitmap.c's compilation unit. But it may be nice to
> prefix them with 'bitmap_' just to make it extra clear that these are
> internal functions meant to be used within the bitmap machinery only.Yeah, sure!
Show 8 quoted lines
> > + static int is_corrupt = 0; > > + > > + if (is_corrupt) > > + return NULL; > > What is the purpose of this conditional? We don't modify `is_corrupt` > before reading it here, so this should be dead code, unless I'm missing > something.
My intention behind this code was - Initially `is_corrupt` is 0, so the above code will not execute for the first `lazy_bitmap...()` call. Now, for some reason, if we get to know that the `.bitmap` file is corrupted, the function will `goto corrupt` and `is_corrupt` will be set to 1. As `is_corrupt` is a static variable, its value will be preserved. So, whenr we call `lazy_bitmap...()` function for the second time (or third time etc.; i.e. `bitmap_for_commit` under a for loop), we instantly know that `.bitmap` file is corrupt (by seeing `is_corrupt`) and we will not do all the computations any more.
Show 10 quoted lines
>
> > + offset = triplet.offset;
> > + xor_row = triplet.xor_row;
> > +
> > + if (xor_row != 0xffffffff) {
>
> Is this outer conditional needed? I don't think it is. If xor_row is
> 0xffffffff, then the while loop below won't be entered, and
> xor_items_nr will be zero, meaning that the second while loop will also
> be skipped.Yes, you're right - it is not needed. But it guarantees that all the code inside its braces will be run only if has a `xor offset` causing the allocation of `xor_items` array as lazy as possible.
Should I remove it?
Show 5 quoted lines
> > + bitmap_git->map_pos = bitmap_git->map_pos + sizeof(uint32_t) + sizeof(uint8_t); > > Could we write: > > bitmap_git->map_pos += sizeof(uint32_t) + sizeof(uint8_t)
Sure!
Thanks :)