On Thu, 24 Mar 2022 15:03:09 -0400, Taylor Blau wrote: > The lack of a break here is intentional, I think, since having more than > one bitmap of the same kind in a repository is an error. Yeah. I quite sure that it's intentional now. Thanks for your explanations. > (This is behavior we inherited from the pre-MIDX bitmap days, when > having more than one pack bitmap caused Git to signal an error, since it > could only use the results from a single bitmap). > > You can see in pack-bitmap.c::open_pack_bitmap_1() that we have a > condition saying: > > if (bitmap_git->pack || bitmap_git->midx) { > /* ignore extra bitmap file; we can only handle one */ > warning("...") > close(fd;) > return -1; > } > > We do want to call that open_pack_bitmap_1() function on every pack we > know about to make sure that one and only one of them corresponds to a > .bitmap. Yeah, the condition and "warning" make it clear to me which is if already exists a bitmap of the pack or MIDX is ready, we will give warnings and just let it fail (return -1 means a return of NULL in "prepare_bitmap_git()", and will then die() in usage cases I found). In addition of above, I had a question that why we need "bitmap_git->midx" in the condition? Because here in "open_pack_bitmap_1()" we intent to open the non-midx-bitmap and it's after we deal with "open_midx_bitmap()" in "open_bitmap()": static int open_bitmap(struct repository *r, struct bitmap_index *bitmap_git) { assert(!bitmap_git->map); if (!open_midx_bitmap(r, bitmap_git)) return 0; return open_pack_bitmap(r, bitmap_git); } So if I understood correct, maybe we can made condition of "bitmap_git->midx" a little earlier so that we can avoid to open every packfile, maybe it's like: diff --git a/pack-bitmap.c b/pack-bitmap.c index 9c666cdb8b..38f53b8f1c 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -483,11 +483,12 @@ static int open_pack_bitmap(struct repository *r, assert(!bitmap_git->map); - for (p = get_all_packs(r); p; p = p->next) { - if (open_pack_bitmap_1(bitmap_git, p) == 0) - ret = 0; + if (!bitmap_git->midx) { + for (p = get_all_packs(r); p; p = p->next) { + if (open_pack_bitmap_1(bitmap_git, p) == 0) + ret = 0; + } } - return ret; } Thanks.