Skip to content

Commit 1f4d89d

Browse files
committed
Merge branch 'tb/pseudo-merge-bitmap-fixes'
We created a useless pseudo-merge reachability bitmap that is about 0 commits, and attempted to include commits that are not in packs, which made no sense. These bugs have been corrected. * tb/pseudo-merge-bitmap-fixes: pseudo-merge.c: ensure pseudo-merge groups are closed pseudo-merge.c: do not generate empty pseudo-merge commits t/t5333-pseudo-merge-bitmaps.sh: demonstrate empty pseudo-merge groups pack-bitmap-write.c: select pseudo-merges even for small bitmaps pack-bitmap: drop redundant args from `bitmap_writer_finish()` pack-bitmap: drop redundant args from `bitmap_writer_build()` pack-bitmap: drop redundant args from `bitmap_writer_build_type_index()` pack-bitmap: initialize `bitmap_writer_init()` with packing_data
2 parents 6e6f68b + a72dfab commit 1f4d89d

File tree

6 files changed

+96
-39
lines changed

6 files changed

+96
-39
lines changed

builtin/pack-objects.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,10 +1342,10 @@ static void write_pack_file(void)
13421342

13431343
if (write_bitmap_index) {
13441344
bitmap_writer_init(&bitmap_writer,
1345-
the_repository);
1345+
the_repository, &to_pack);
13461346
bitmap_writer_set_checksum(&bitmap_writer, hash);
13471347
bitmap_writer_build_type_index(&bitmap_writer,
1348-
&to_pack, written_list, nr_written);
1348+
written_list);
13491349
}
13501350

13511351
if (cruft)
@@ -1367,10 +1367,10 @@ static void write_pack_file(void)
13671367
bitmap_writer_select_commits(&bitmap_writer,
13681368
indexed_commits,
13691369
indexed_commits_nr);
1370-
if (bitmap_writer_build(&bitmap_writer, &to_pack) < 0)
1370+
if (bitmap_writer_build(&bitmap_writer) < 0)
13711371
die(_("failed to write bitmap index"));
13721372
bitmap_writer_finish(&bitmap_writer,
1373-
written_list, nr_written,
1373+
written_list,
13741374
tmpname.buf, write_bitmap_options);
13751375
bitmap_writer_free(&bitmap_writer);
13761376
write_bitmap_index = 0;

midx-write.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -858,10 +858,9 @@ static int write_midx_bitmap(const char *midx_name,
858858
for (i = 0; i < pdata->nr_objects; i++)
859859
index[i] = &pdata->objects[i].idx;
860860

861-
bitmap_writer_init(&writer, the_repository);
861+
bitmap_writer_init(&writer, the_repository, pdata);
862862
bitmap_writer_show_progress(&writer, flags & MIDX_PROGRESS);
863-
bitmap_writer_build_type_index(&writer, pdata, index,
864-
pdata->nr_objects);
863+
bitmap_writer_build_type_index(&writer, index);
865864

866865
/*
867866
* bitmap_writer_finish expects objects in lex order, but pack_order
@@ -880,13 +879,12 @@ static int write_midx_bitmap(const char *midx_name,
880879
index[pack_order[i]] = &pdata->objects[i].idx;
881880

882881
bitmap_writer_select_commits(&writer, commits, commits_nr);
883-
ret = bitmap_writer_build(&writer, pdata);
882+
ret = bitmap_writer_build(&writer);
884883
if (ret < 0)
885884
goto cleanup;
886885

887886
bitmap_writer_set_checksum(&writer, midx_hash);
888-
bitmap_writer_finish(&writer, index, pdata->nr_objects, bitmap_name,
889-
options);
887+
bitmap_writer_finish(&writer, index, bitmap_name, options);
890888

891889
cleanup:
892890
free(index);

pack-bitmap-write.c

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@ static inline int bitmap_writer_nr_selected_commits(struct bitmap_writer *writer
4141
return writer->selected_nr - writer->pseudo_merges_nr;
4242
}
4343

44-
void bitmap_writer_init(struct bitmap_writer *writer, struct repository *r)
44+
void bitmap_writer_init(struct bitmap_writer *writer, struct repository *r,
45+
struct packing_data *pdata)
4546
{
4647
memset(writer, 0, sizeof(struct bitmap_writer));
4748
if (writer->bitmaps)
4849
BUG("bitmap writer already initialized");
4950
writer->bitmaps = kh_init_oid_map();
5051
writer->pseudo_merge_commits = kh_init_oid_map();
52+
writer->to_pack = pdata;
5153

5254
string_list_init_dup(&writer->pseudo_merge_groups);
5355

@@ -99,23 +101,21 @@ void bitmap_writer_show_progress(struct bitmap_writer *writer, int show)
99101
* Build the initial type index for the packfile or multi-pack-index
100102
*/
101103
void bitmap_writer_build_type_index(struct bitmap_writer *writer,
102-
struct packing_data *to_pack,
103-
struct pack_idx_entry **index,
104-
uint32_t index_nr)
104+
struct pack_idx_entry **index)
105105
{
106106
uint32_t i;
107107

108108
writer->commits = ewah_new();
109109
writer->trees = ewah_new();
110110
writer->blobs = ewah_new();
111111
writer->tags = ewah_new();
112-
ALLOC_ARRAY(to_pack->in_pack_pos, to_pack->nr_objects);
112+
ALLOC_ARRAY(writer->to_pack->in_pack_pos, writer->to_pack->nr_objects);
113113

114-
for (i = 0; i < index_nr; ++i) {
114+
for (i = 0; i < writer->to_pack->nr_objects; ++i) {
115115
struct object_entry *entry = (struct object_entry *)index[i];
116116
enum object_type real_type;
117117

118-
oe_set_in_pack_pos(to_pack, entry, i);
118+
oe_set_in_pack_pos(writer->to_pack, entry, i);
119119

120120
switch (oe_type(entry)) {
121121
case OBJ_COMMIT:
@@ -126,7 +126,7 @@ void bitmap_writer_build_type_index(struct bitmap_writer *writer,
126126
break;
127127

128128
default:
129-
real_type = oid_object_info(to_pack->repo,
129+
real_type = oid_object_info(writer->to_pack->repo,
130130
&entry->idx.oid, NULL);
131131
break;
132132
}
@@ -569,8 +569,7 @@ static void store_selected(struct bitmap_writer *writer,
569569
kh_value(writer->bitmaps, hash_pos) = stored;
570570
}
571571

572-
int bitmap_writer_build(struct bitmap_writer *writer,
573-
struct packing_data *to_pack)
572+
int bitmap_writer_build(struct bitmap_writer *writer)
574573
{
575574
struct bitmap_builder bb;
576575
size_t i;
@@ -581,17 +580,15 @@ int bitmap_writer_build(struct bitmap_writer *writer,
581580
uint32_t *mapping;
582581
int closed = 1; /* until proven otherwise */
583582

584-
writer->to_pack = to_pack;
585-
586583
if (writer->show_progress)
587584
writer->progress = start_progress("Building bitmaps",
588585
writer->selected_nr);
589586
trace2_region_enter("pack-bitmap-write", "building_bitmaps_total",
590587
the_repository);
591588

592-
old_bitmap = prepare_bitmap_git(to_pack->repo);
589+
old_bitmap = prepare_bitmap_git(writer->to_pack->repo);
593590
if (old_bitmap)
594-
mapping = create_bitmap_mapping(old_bitmap, to_pack);
591+
mapping = create_bitmap_mapping(old_bitmap, writer->to_pack);
595592
else
596593
mapping = NULL;
597594

@@ -697,6 +694,10 @@ void bitmap_writer_select_commits(struct bitmap_writer *writer,
697694
if (indexed_commits_nr < 100) {
698695
for (i = 0; i < indexed_commits_nr; ++i)
699696
bitmap_writer_push_commit(writer, indexed_commits[i], 0);
697+
698+
select_pseudo_merges(writer, indexed_commits,
699+
indexed_commits_nr);
700+
700701
return;
701702
}
702703

@@ -1001,7 +1002,6 @@ void bitmap_writer_set_checksum(struct bitmap_writer *writer,
10011002

10021003
void bitmap_writer_finish(struct bitmap_writer *writer,
10031004
struct pack_idx_entry **index,
1004-
uint32_t index_nr,
10051005
const char *filename,
10061006
uint16_t options)
10071007
{
@@ -1034,12 +1034,13 @@ void bitmap_writer_finish(struct bitmap_writer *writer,
10341034
dump_bitmap(f, writer->tags);
10351035

10361036
if (options & BITMAP_OPT_LOOKUP_TABLE)
1037-
CALLOC_ARRAY(offsets, index_nr);
1037+
CALLOC_ARRAY(offsets, writer->to_pack->nr_objects);
10381038

10391039
for (i = 0; i < bitmap_writer_nr_selected_commits(writer); i++) {
10401040
struct bitmapped_commit *stored = &writer->selected[i];
10411041
int commit_pos = oid_pos(&stored->commit->object.oid, index,
1042-
index_nr, oid_access);
1042+
writer->to_pack->nr_objects,
1043+
oid_access);
10431044

10441045
if (commit_pos < 0)
10451046
BUG(_("trying to write commit not in index"));
@@ -1055,7 +1056,7 @@ void bitmap_writer_finish(struct bitmap_writer *writer,
10551056
write_lookup_table(writer, f, offsets);
10561057

10571058
if (options & BITMAP_OPT_HASH_CACHE)
1058-
write_hash_cache(f, index, index_nr);
1059+
write_hash_cache(f, index, writer->to_pack->nr_objects);
10591060

10601061
finalize_hashfile(f, NULL, FSYNC_COMPONENT_PACK_METADATA,
10611062
CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);

pack-bitmap.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,13 @@ struct bitmap_writer {
123123
unsigned char pack_checksum[GIT_MAX_RAWSZ];
124124
};
125125

126-
void bitmap_writer_init(struct bitmap_writer *writer, struct repository *r);
126+
void bitmap_writer_init(struct bitmap_writer *writer, struct repository *r,
127+
struct packing_data *pdata);
127128
void bitmap_writer_show_progress(struct bitmap_writer *writer, int show);
128129
void bitmap_writer_set_checksum(struct bitmap_writer *writer,
129130
const unsigned char *sha1);
130131
void bitmap_writer_build_type_index(struct bitmap_writer *writer,
131-
struct packing_data *to_pack,
132-
struct pack_idx_entry **index,
133-
uint32_t index_nr);
132+
struct pack_idx_entry **index);
134133
int bitmap_writer_has_bitmapped_object_id(struct bitmap_writer *writer,
135134
const struct object_id *oid);
136135
void bitmap_writer_push_commit(struct bitmap_writer *writer,
@@ -147,11 +146,9 @@ struct ewah_bitmap *pseudo_merge_bitmap_for_commit(struct bitmap_index *bitmap_g
147146
void bitmap_writer_select_commits(struct bitmap_writer *writer,
148147
struct commit **indexed_commits,
149148
unsigned int indexed_commits_nr);
150-
int bitmap_writer_build(struct bitmap_writer *writer,
151-
struct packing_data *to_pack);
149+
int bitmap_writer_build(struct bitmap_writer *writer);
152150
void bitmap_writer_finish(struct bitmap_writer *writer,
153151
struct pack_idx_entry **index,
154-
uint32_t index_nr,
155152
const char *filename,
156153
uint16_t options);
157154
void bitmap_writer_free(struct bitmap_writer *writer);

pseudo-merge.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ static int find_pseudo_merge_group_for_ref(const char *refname,
218218
c = lookup_commit(the_repository, oid);
219219
if (!c)
220220
return 0;
221+
if (!packlist_find(writer->to_pack, oid))
222+
return 0;
221223

222224
has_bitmap = bitmap_writer_has_bitmapped_object_id(writer, oid);
223225

@@ -358,8 +360,10 @@ static void select_pseudo_merges_1(struct bitmap_writer *writer,
358360
p = commit_list_append(c, p);
359361
} while (j % group->stable_size);
360362

361-
bitmap_writer_push_commit(writer, merge, 1);
362-
writer->pseudo_merges_nr++;
363+
if (merge->parents) {
364+
bitmap_writer_push_commit(writer, merge, 1);
365+
writer->pseudo_merges_nr++;
366+
}
363367
}
364368

365369
/* make up to group->max_merges pseudo merges for unstable commits */
@@ -399,8 +403,9 @@ static void select_pseudo_merges_1(struct bitmap_writer *writer,
399403
p = commit_list_append(c, p);
400404
}
401405

402-
bitmap_writer_push_commit(writer, merge, 1);
403-
writer->pseudo_merges_nr++;
406+
if (merge->parents) {
407+
bitmap_writer_push_commit(writer, merge, 1);
408+
writer->pseudo_merges_nr++; }
404409
if (end >= matches->unstable_nr)
405410
break;
406411
}

t/t5333-pseudo-merge-bitmaps.sh

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,4 +390,60 @@ test_expect_success 'pseudo-merge reuse' '
390390
)
391391
'
392392

393+
test_expect_success 'empty pseudo-merge group' '
394+
git init pseudo-merge-empty-group &&
395+
(
396+
cd pseudo-merge-empty-group &&
397+
398+
# Ensure that a pseudo-merge group with no unstable
399+
# commits does not generate an empty pseudo-merge
400+
# bitmap.
401+
git config bitmapPseudoMerge.empty.pattern refs/ &&
402+
403+
test_commit base &&
404+
git repack -adb &&
405+
406+
test-tool bitmap dump-pseudo-merges >merges &&
407+
test_line_count = 1 merges &&
408+
409+
test 0 -eq "$(grep -c commits=0 <merges)"
410+
)
411+
'
412+
413+
test_expect_success 'pseudo-merge closure' '
414+
git init pseudo-merge-closure &&
415+
(
416+
cd pseudo-merge-closure &&
417+
418+
test_commit A &&
419+
git repack -d &&
420+
421+
test_commit B &&
422+
423+
# Note that the contents of A is packed, but B is not. A
424+
# (and the objects reachable from it) are thus visible
425+
# to the MIDX, but the same is not true for B and its
426+
# objects.
427+
#
428+
# Ensure that we do not attempt to create a pseudo-merge
429+
# for B, depsite it matching the below pseudo-merge
430+
# group pattern, as doing so would result in a failure
431+
# to write a non-closed bitmap.
432+
git config bitmapPseudoMerge.test.pattern refs/ &&
433+
git config bitmapPseudoMerge.test.threshold now &&
434+
435+
git multi-pack-index write --bitmap &&
436+
437+
test-tool bitmap dump-pseudo-merges >pseudo-merges &&
438+
test_line_count = 1 pseudo-merges &&
439+
440+
git rev-parse A >expect &&
441+
442+
test-tool bitmap list-commits >actual &&
443+
test_cmp expect actual &&
444+
test-tool bitmap dump-pseudo-merge-commits 0 >actual &&
445+
test_cmp expect actual
446+
)
447+
'
448+
393449
test_done

0 commit comments

Comments
 (0)