midx: teach midx_fanout_add_midx_fanout()
about incremental MIDXs
The function `midx_fanout_add_midx_fanout()` is used to help construct
the fanout table when generating a MIDX by reusing data from an existing
MIDX.
Prepare this function to work with incremental MIDXs by making a few
changes:
- The bounds checks need to be adjusted to start object lookups taking
into account the number of objects in the previous MIDX layer (i.e.,
by starting the lookups at position `m->num_objects_in_base` instead
of position 0).
- Likewise, the bounds checks need to end at `m->num_objects_in_base`
objects after `m->num_objects`.
- Finally, `midx_fanout_add_midx_fanout()` needs to recur on earlier
MIDX layers when dealing with an incremental MIDX chain by calling
itself when given a MIDX with a non-NULL `base_midx`.
Note that after 0c5a62f14b
(midx-write.c: do not read existing MIDX with
`packs_to_include`, 2024-06-11), we do not use this function with an
existing MIDX (incremental or not) when generating a MIDX with
--stdin-packs, and likewise for incremental MIDXs.
But it is still used when adding the fanout table from an incremental
MIDX when generating a non-incremental MIDX (without --stdin-packs, of
course).
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
b31f2aac56
commit
97fd770ea1
12
midx-write.c
12
midx-write.c
@ -196,7 +196,7 @@ static int nth_midxed_pack_midx_entry(struct multi_pack_index *m,
|
|||||||
struct pack_midx_entry *e,
|
struct pack_midx_entry *e,
|
||||||
uint32_t pos)
|
uint32_t pos)
|
||||||
{
|
{
|
||||||
if (pos >= m->num_objects)
|
if (pos >= m->num_objects + m->num_objects_in_base)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
nth_midxed_object_oid(&e->oid, m, pos);
|
nth_midxed_object_oid(&e->oid, m, pos);
|
||||||
@ -247,12 +247,16 @@ static void midx_fanout_add_midx_fanout(struct midx_fanout *fanout,
|
|||||||
uint32_t cur_fanout,
|
uint32_t cur_fanout,
|
||||||
int preferred_pack)
|
int preferred_pack)
|
||||||
{
|
{
|
||||||
uint32_t start = 0, end;
|
uint32_t start = m->num_objects_in_base, end;
|
||||||
uint32_t cur_object;
|
uint32_t cur_object;
|
||||||
|
|
||||||
|
if (m->base_midx)
|
||||||
|
midx_fanout_add_midx_fanout(fanout, m->base_midx, cur_fanout,
|
||||||
|
preferred_pack);
|
||||||
|
|
||||||
if (cur_fanout)
|
if (cur_fanout)
|
||||||
start = ntohl(m->chunk_oid_fanout[cur_fanout - 1]);
|
start += ntohl(m->chunk_oid_fanout[cur_fanout - 1]);
|
||||||
end = ntohl(m->chunk_oid_fanout[cur_fanout]);
|
end = m->num_objects_in_base + ntohl(m->chunk_oid_fanout[cur_fanout]);
|
||||||
|
|
||||||
for (cur_object = start; cur_object < end; cur_object++) {
|
for (cur_object = start; cur_object < end; cur_object++) {
|
||||||
if ((preferred_pack > -1) &&
|
if ((preferred_pack > -1) &&
|
||||||
|
Reference in New Issue
Block a user