Skip to content

Commit 4337e19

Browse files
ttaylorrgitster
authored andcommitted
pack-revindex: prepare for incremental MIDX bitmaps
Prepare the reverse index machinery to handle object lookups in an incremental MIDX bitmap. These changes are broken out across a few functions: - load_midx_revindex() learns to use the appropriate MIDX filename depending on whether the given 'struct multi_pack_index *' is incremental or not. - pack_pos_to_midx() and midx_to_pack_pos() now both take in a global object position in the MIDX pseudo-pack order, and finds the earliest containing MIDX (similar to midx.c::midx_for_object(). - midx_pack_order_cmp() adjusts its call to pack_pos_to_midx() by the number of objects in the base (since 'vb - midx->revindx_data' is relative to the containing MIDX, and pack_pos_to_midx() expects a global position). Likewise, this function adjusts its output by adding m->num_objects_in_base to return a global position out through the `*pos` pointer. Together, these changes are sufficient to use the multi-pack index's reverse index format for incremental multi-pack reachability bitmaps. Signed-off-by: Taylor Blau <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d508e43 commit 4337e19

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed

pack-bitmap.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,15 @@ static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index)
170170
return read_bitmap(index->map, index->map_size, &index->map_pos);
171171
}
172172

173+
static uint32_t bitmap_non_extended_bits(struct bitmap_index *index)
174+
{
175+
if (index->midx) {
176+
struct multi_pack_index *m = index->midx;
177+
return m->num_objects + m->num_objects_in_base;
178+
}
179+
return index->pack->num_objects;
180+
}
181+
173182
static uint32_t bitmap_num_objects(struct bitmap_index *index)
174183
{
175184
if (index->midx)
@@ -925,7 +934,7 @@ static inline int bitmap_position_extended(struct bitmap_index *bitmap_git,
925934

926935
if (pos < kh_end(positions)) {
927936
int bitmap_pos = kh_value(positions, pos);
928-
return bitmap_pos + bitmap_num_objects(bitmap_git);
937+
return bitmap_pos + bitmap_non_extended_bits(bitmap_git);
929938
}
930939

931940
return -1;
@@ -993,7 +1002,7 @@ static int ext_index_add_object(struct bitmap_index *bitmap_git,
9931002
bitmap_pos = kh_value(eindex->positions, hash_pos);
9941003
}
9951004

996-
return bitmap_pos + bitmap_num_objects(bitmap_git);
1005+
return bitmap_pos + bitmap_non_extended_bits(bitmap_git);
9971006
}
9981007

9991008
struct bitmap_show_data {
@@ -1498,7 +1507,8 @@ static void show_extended_objects(struct bitmap_index *bitmap_git,
14981507
for (i = 0; i < eindex->count; ++i) {
14991508
struct object *obj;
15001509

1501-
if (!bitmap_get(objects, st_add(bitmap_num_objects(bitmap_git), i)))
1510+
if (!bitmap_get(objects,
1511+
st_add(bitmap_non_extended_bits(bitmap_git), i)))
15021512
continue;
15031513

15041514
obj = eindex->objects[i];
@@ -1677,7 +1687,7 @@ static void filter_bitmap_exclude_type(struct bitmap_index *bitmap_git,
16771687
* them individually.
16781688
*/
16791689
for (i = 0; i < eindex->count; i++) {
1680-
size_t pos = st_add(i, bitmap_num_objects(bitmap_git));
1690+
size_t pos = st_add(i, bitmap_non_extended_bits(bitmap_git));
16811691
if (eindex->objects[i]->type == type &&
16821692
bitmap_get(to_filter, pos) &&
16831693
!bitmap_get(tips, pos))
@@ -1703,7 +1713,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
17031713

17041714
oi.sizep = &size;
17051715

1706-
if (pos < bitmap_num_objects(bitmap_git)) {
1716+
if (pos < bitmap_non_extended_bits(bitmap_git)) {
17071717
struct packed_git *pack;
17081718
off_t ofs;
17091719

@@ -1726,7 +1736,7 @@ static unsigned long get_size_by_pos(struct bitmap_index *bitmap_git,
17261736
}
17271737
} else {
17281738
struct eindex *eindex = &bitmap_git->ext_index;
1729-
struct object *obj = eindex->objects[pos - bitmap_num_objects(bitmap_git)];
1739+
struct object *obj = eindex->objects[pos - bitmap_non_extended_bits(bitmap_git)];
17301740
if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)
17311741
die(_("unable to get size of %s"), oid_to_hex(&obj->oid));
17321742
}
@@ -1878,7 +1888,7 @@ static void filter_packed_objects_from_bitmap(struct bitmap_index *bitmap_git,
18781888
uint32_t objects_nr;
18791889
size_t i, pos;
18801890

1881-
objects_nr = bitmap_num_objects(bitmap_git);
1891+
objects_nr = bitmap_non_extended_bits(bitmap_git);
18821892
pos = objects_nr / BITS_IN_EWORD;
18831893

18841894
if (pos > result->word_alloc)
@@ -2399,7 +2409,7 @@ static uint32_t count_object_type(struct bitmap_index *bitmap_git,
23992409
for (i = 0; i < eindex->count; ++i) {
24002410
if (eindex->objects[i]->type == type &&
24012411
bitmap_get(objects,
2402-
st_add(bitmap_num_objects(bitmap_git), i)))
2412+
st_add(bitmap_non_extended_bits(bitmap_git), i)))
24032413
count++;
24042414
}
24052415

@@ -2798,7 +2808,7 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
27982808
BUG("rebuild_existing_bitmaps: missing required rev-cache "
27992809
"extension");
28002810

2801-
num_objects = bitmap_num_objects(bitmap_git);
2811+
num_objects = bitmap_non_extended_bits(bitmap_git);
28022812
CALLOC_ARRAY(reposition, num_objects);
28032813

28042814
for (i = 0; i < num_objects; ++i) {
@@ -2941,7 +2951,7 @@ static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
29412951
struct object *obj = eindex->objects[i];
29422952

29432953
if (!bitmap_get(result,
2944-
st_add(bitmap_num_objects(bitmap_git), i)))
2954+
st_add(bitmap_non_extended_bits(bitmap_git), i)))
29452955
continue;
29462956

29472957
if (oid_object_info_extended(the_repository, &obj->oid, &oi, 0) < 0)

pack-revindex.c

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,12 @@ int load_midx_revindex(struct multi_pack_index *m)
383383
trace2_data_string("load_midx_revindex", the_repository,
384384
"source", "rev");
385385

386-
get_midx_filename_ext(&revindex_name, m->object_dir,
387-
get_midx_checksum(m), MIDX_EXT_REV);
386+
if (m->has_chain)
387+
get_split_midx_filename_ext(&revindex_name, m->object_dir,
388+
get_midx_checksum(m), MIDX_EXT_REV);
389+
else
390+
get_midx_filename_ext(&revindex_name, m->object_dir,
391+
get_midx_checksum(m), MIDX_EXT_REV);
388392

389393
ret = load_revindex_from_disk(revindex_name.buf,
390394
m->num_objects,
@@ -471,11 +475,15 @@ off_t pack_pos_to_offset(struct packed_git *p, uint32_t pos)
471475

472476
uint32_t pack_pos_to_midx(struct multi_pack_index *m, uint32_t pos)
473477
{
478+
while (m && pos < m->num_objects_in_base)
479+
m = m->base_midx;
480+
if (!m)
481+
BUG("NULL multi-pack-index for object position: %"PRIu32, pos);
474482
if (!m->revindex_data)
475483
BUG("pack_pos_to_midx: reverse index not yet loaded");
476-
if (m->num_objects <= pos)
484+
if (m->num_objects + m->num_objects_in_base <= pos)
477485
BUG("pack_pos_to_midx: out-of-bounds object at %"PRIu32, pos);
478-
return get_be32(m->revindex_data + pos);
486+
return get_be32(m->revindex_data + pos - m->num_objects_in_base);
479487
}
480488

481489
struct midx_pack_key {
@@ -491,7 +499,8 @@ static int midx_pack_order_cmp(const void *va, const void *vb)
491499
const struct midx_pack_key *key = va;
492500
struct multi_pack_index *midx = key->midx;
493501

494-
uint32_t versus = pack_pos_to_midx(midx, (uint32_t*)vb - (const uint32_t *)midx->revindex_data);
502+
size_t pos = (uint32_t*)vb - (const uint32_t *)midx->revindex_data;
503+
uint32_t versus = pack_pos_to_midx(midx, pos + midx->num_objects_in_base);
495504
uint32_t versus_pack = nth_midxed_pack_int_id(midx, versus);
496505
off_t versus_offset;
497506

@@ -529,9 +538,9 @@ static int midx_key_to_pack_pos(struct multi_pack_index *m,
529538
{
530539
uint32_t *found;
531540

532-
if (key->pack >= m->num_packs)
541+
if (key->pack >= m->num_packs + m->num_packs_in_base)
533542
BUG("MIDX pack lookup out of bounds (%"PRIu32" >= %"PRIu32")",
534-
key->pack, m->num_packs);
543+
key->pack, m->num_packs + m->num_packs_in_base);
535544
/*
536545
* The preferred pack sorts first, so determine its identifier by
537546
* looking at the first object in pseudo-pack order.
@@ -551,17 +560,22 @@ static int midx_key_to_pack_pos(struct multi_pack_index *m,
551560
if (!found)
552561
return -1;
553562

554-
*pos = found - m->revindex_data;
563+
*pos = (found - m->revindex_data) + m->num_objects_in_base;
564+
555565
return 0;
556566
}
557567

558568
int midx_to_pack_pos(struct multi_pack_index *m, uint32_t at, uint32_t *pos)
559569
{
560570
struct midx_pack_key key;
561571

572+
while (m && at < m->num_objects_in_base)
573+
m = m->base_midx;
574+
if (!m)
575+
BUG("NULL multi-pack-index for object position: %"PRIu32, at);
562576
if (!m->revindex_data)
563577
BUG("midx_to_pack_pos: reverse index not yet loaded");
564-
if (m->num_objects <= at)
578+
if (m->num_objects + m->num_objects_in_base <= at)
565579
BUG("midx_to_pack_pos: out-of-bounds object at %"PRIu32, at);
566580

567581
key.pack = nth_midxed_pack_int_id(m, at);

0 commit comments

Comments
 (0)