Merge branch 'tb/midx-bitmap-selection-fix'

A bugfix with tracing support in midx codepath

* tb/midx-bitmap-selection-fix:
  pack-bitmap-write.c: instrument number of reused bitmaps
  midx.c: instrument MIDX and bitmap generation with trace2 regions
  midx.c: consider annotated tags during bitmap selection
  midx.c: fix whitespace typo
maint
Junio C Hamano 2022-10-27 14:51:52 -07:00
commit 99bb1a0bea
3 changed files with 64 additions and 2 deletions

34
midx.c
View File

@ -278,7 +278,7 @@ uint32_t nth_midxed_pack_int_id(struct multi_pack_index *m, uint32_t pos)
(off_t)pos * MIDX_CHUNK_OFFSET_WIDTH); (off_t)pos * MIDX_CHUNK_OFFSET_WIDTH);
} }


int fill_midx_entry(struct repository * r, int fill_midx_entry(struct repository *r,
const struct object_id *oid, const struct object_id *oid,
struct pack_entry *e, struct pack_entry *e,
struct multi_pack_index *m) struct multi_pack_index *m)
@ -913,6 +913,8 @@ static uint32_t *midx_pack_order(struct write_midx_context *ctx)
uint32_t *pack_order; uint32_t *pack_order;
uint32_t i; uint32_t i;


trace2_region_enter("midx", "midx_pack_order", the_repository);

ALLOC_ARRAY(data, ctx->entries_nr); ALLOC_ARRAY(data, ctx->entries_nr);
for (i = 0; i < ctx->entries_nr; i++) { for (i = 0; i < ctx->entries_nr; i++) {
struct pack_midx_entry *e = &ctx->entries[i]; struct pack_midx_entry *e = &ctx->entries[i];
@ -930,6 +932,8 @@ static uint32_t *midx_pack_order(struct write_midx_context *ctx)
pack_order[i] = data[i].nr; pack_order[i] = data[i].nr;
free(data); free(data);


trace2_region_leave("midx", "midx_pack_order", the_repository);

return pack_order; return pack_order;
} }


@ -939,6 +943,8 @@ static void write_midx_reverse_index(char *midx_name, unsigned char *midx_hash,
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
const char *tmp_file; const char *tmp_file;


trace2_region_enter("midx", "write_midx_reverse_index", the_repository);

strbuf_addf(&buf, "%s-%s.rev", midx_name, hash_to_hex(midx_hash)); strbuf_addf(&buf, "%s-%s.rev", midx_name, hash_to_hex(midx_hash));


tmp_file = write_rev_file_order(NULL, ctx->pack_order, ctx->entries_nr, tmp_file = write_rev_file_order(NULL, ctx->pack_order, ctx->entries_nr,
@ -948,6 +954,8 @@ static void write_midx_reverse_index(char *midx_name, unsigned char *midx_hash,
die(_("cannot store reverse index file")); die(_("cannot store reverse index file"));


strbuf_release(&buf); strbuf_release(&buf);

trace2_region_leave("midx", "write_midx_reverse_index", the_repository);
} }


static void clear_midx_files_ext(const char *object_dir, const char *ext, static void clear_midx_files_ext(const char *object_dir, const char *ext,
@ -963,6 +971,8 @@ static void prepare_midx_packing_data(struct packing_data *pdata,
{ {
uint32_t i; uint32_t i;


trace2_region_enter("midx", "prepare_midx_packing_data", the_repository);

memset(pdata, 0, sizeof(struct packing_data)); memset(pdata, 0, sizeof(struct packing_data));
prepare_packing_data(the_repository, pdata); prepare_packing_data(the_repository, pdata);


@ -973,6 +983,8 @@ static void prepare_midx_packing_data(struct packing_data *pdata,
oe_set_in_pack(pdata, to, oe_set_in_pack(pdata, to,
ctx->info[ctx->pack_perm[from->pack_int_id]].p); ctx->info[ctx->pack_perm[from->pack_int_id]].p);
} }

trace2_region_leave("midx", "prepare_midx_packing_data", the_repository);
} }


static int add_ref_to_pending(const char *refname, static int add_ref_to_pending(const char *refname,
@ -980,6 +992,7 @@ static int add_ref_to_pending(const char *refname,
int flag, void *cb_data) int flag, void *cb_data)
{ {
struct rev_info *revs = (struct rev_info*)cb_data; struct rev_info *revs = (struct rev_info*)cb_data;
struct object_id peeled;
struct object *object; struct object *object;


if ((flag & REF_ISSYMREF) && (flag & REF_ISBROKEN)) { if ((flag & REF_ISSYMREF) && (flag & REF_ISBROKEN)) {
@ -987,6 +1000,9 @@ static int add_ref_to_pending(const char *refname,
return 0; return 0;
} }


if (!peel_iterated_oid(oid, &peeled))
oid = &peeled;

object = parse_object_or_die(oid, refname); object = parse_object_or_die(oid, refname);
if (object->type != OBJ_COMMIT) if (object->type != OBJ_COMMIT)
return 0; return 0;
@ -1066,6 +1082,9 @@ static struct commit **find_commits_for_midx_bitmap(uint32_t *indexed_commits_nr
struct rev_info revs; struct rev_info revs;
struct bitmap_commit_cb cb = {0}; struct bitmap_commit_cb cb = {0};


trace2_region_enter("midx", "find_commits_for_midx_bitmap",
the_repository);

cb.ctx = ctx; cb.ctx = ctx;


repo_init_revisions(the_repository, &revs, NULL); repo_init_revisions(the_repository, &revs, NULL);
@ -1099,6 +1118,10 @@ static struct commit **find_commits_for_midx_bitmap(uint32_t *indexed_commits_nr
*indexed_commits_nr_p = cb.commits_nr; *indexed_commits_nr_p = cb.commits_nr;


release_revisions(&revs); release_revisions(&revs);

trace2_region_leave("midx", "find_commits_for_midx_bitmap",
the_repository);

return cb.commits; return cb.commits;
} }


@ -1116,6 +1139,8 @@ static int write_midx_bitmap(const char *midx_name,
char *bitmap_name = xstrfmt("%s-%s.bitmap", midx_name, char *bitmap_name = xstrfmt("%s-%s.bitmap", midx_name,
hash_to_hex(midx_hash)); hash_to_hex(midx_hash));


trace2_region_enter("midx", "write_midx_bitmap", the_repository);

if (flags & MIDX_WRITE_BITMAP_HASH_CACHE) if (flags & MIDX_WRITE_BITMAP_HASH_CACHE)
options |= BITMAP_OPT_HASH_CACHE; options |= BITMAP_OPT_HASH_CACHE;


@ -1161,6 +1186,9 @@ static int write_midx_bitmap(const char *midx_name,
cleanup: cleanup:
free(index); free(index);
free(bitmap_name); free(bitmap_name);

trace2_region_leave("midx", "write_midx_bitmap", the_repository);

return ret; return ret;
} }


@ -1207,6 +1235,8 @@ static int write_midx_internal(const char *object_dir,
int result = 0; int result = 0;
struct chunkfile *cf; struct chunkfile *cf;


trace2_region_enter("midx", "write_midx_internal", the_repository);

get_midx_filename(&midx_name, object_dir); get_midx_filename(&midx_name, object_dir);
if (safe_create_leading_directories(midx_name.buf)) if (safe_create_leading_directories(midx_name.buf))
die_errno(_("unable to create leading directories of %s"), die_errno(_("unable to create leading directories of %s"),
@ -1548,6 +1578,8 @@ cleanup:
free(ctx.pack_order); free(ctx.pack_order);
strbuf_release(&midx_name); strbuf_release(&midx_name);


trace2_region_leave("midx", "write_midx_internal", the_repository);

return result; return result;
} }



View File

@ -384,6 +384,8 @@ static int fill_bitmap_tree(struct bitmap *bitmap,
return 0; return 0;
} }


static int reused_bitmaps_nr;

static int fill_bitmap_commit(struct bb_commit *ent, static int fill_bitmap_commit(struct bb_commit *ent,
struct commit *commit, struct commit *commit,
struct prio_queue *queue, struct prio_queue *queue,
@ -409,8 +411,10 @@ static int fill_bitmap_commit(struct bb_commit *ent,
* bitmap and add its bits to this one. No need to walk * bitmap and add its bits to this one. No need to walk
* parents or the tree for this commit. * parents or the tree for this commit.
*/ */
if (old && !rebuild_bitmap(mapping, old, ent->bitmap)) if (old && !rebuild_bitmap(mapping, old, ent->bitmap)) {
reused_bitmaps_nr++;
continue; continue;
}
} }


/* /*
@ -526,6 +530,8 @@ int bitmap_writer_build(struct packing_data *to_pack)


trace2_region_leave("pack-bitmap-write", "building_bitmaps_total", trace2_region_leave("pack-bitmap-write", "building_bitmaps_total",
the_repository); the_repository);
trace2_data_intmax("pack-bitmap-write", the_repository,
"building_bitmaps_reused", reused_bitmaps_nr);


stop_progress(&writer.progress); stop_progress(&writer.progress);



View File

@ -410,4 +410,28 @@ test_expect_success 'preferred pack change with existing MIDX bitmap' '
) )
' '


test_expect_success 'tagged commits are selected for bitmapping' '
rm -fr repo &&
git init repo &&
test_when_finished "rm -fr repo" &&
(
cd repo &&

test_commit --annotate base &&
git repack -d &&

# Remove refs/heads/main which points at the commit directly,
# leaving only a reference to the annotated tag.
git branch -M main &&
git checkout base &&
git branch -d main &&

git multi-pack-index write --bitmap &&

git rev-parse HEAD >want &&
test-tool bitmap list-commits >actual &&
grep $(cat want) actual
)
'

test_done test_done