midx: stop duplicating info redundant with its owning source

Multi-pack indices store some information that is redundant with their
owning source:

  - The locality bit that tracks whether the source is the primary
    object source or an alternate.

  - The object directory path the multi-pack index is located in.

  - The pointer to the owning parent directory.

All of this information is already contained in `struct odb_source`. So
now that we always have that struct available when loading a multi-pack
index we have it readily accessible.

Drop the redundant information and instead store a pointer to the object
source.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
Patrick Steinhardt 2025-08-11 15:46:49 +02:00 committed by Junio C Hamano
parent c3f5d25146
commit 7744936f37
7 changed files with 36 additions and 35 deletions

View File

@ -223,9 +223,10 @@ static void mark_packs_for_deletion(struct existing_packs *existing,
static void remove_redundant_pack(const char *dir_name, const char *base_name) static void remove_redundant_pack(const char *dir_name, const char *base_name)
{ {
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
struct multi_pack_index *m = get_multi_pack_index(the_repository->objects->sources); struct odb_source *source = the_repository->objects->sources;
struct multi_pack_index *m = get_multi_pack_index(source);
strbuf_addf(&buf, "%s.pack", base_name); strbuf_addf(&buf, "%s.pack", base_name);
if (m && m->local && midx_contains_pack(m, buf.buf)) if (m && source->local && midx_contains_pack(m, buf.buf))
clear_midx_file(the_repository); clear_midx_file(the_repository);
strbuf_insertf(&buf, 0, "%s/", dir_name); strbuf_insertf(&buf, 0, "%s/", dir_name);
unlink_pack_path(buf.buf, 1); unlink_pack_path(buf.buf, 1);

View File

@ -981,10 +981,11 @@ static int link_midx_to_chain(struct multi_pack_index *m)
for (i = 0; i < ARRAY_SIZE(midx_exts); i++) { for (i = 0; i < ARRAY_SIZE(midx_exts); i++) {
const unsigned char *hash = get_midx_checksum(m); const unsigned char *hash = get_midx_checksum(m);


get_midx_filename_ext(m->repo->hash_algo, &from, m->object_dir, get_midx_filename_ext(m->source->odb->repo->hash_algo, &from,
m->source->path,
hash, midx_exts[i].non_split); hash, midx_exts[i].non_split);
get_split_midx_filename_ext(m->repo->hash_algo, &to, get_split_midx_filename_ext(m->source->odb->repo->hash_algo, &to,
m->object_dir, hash, m->source->path, hash,
midx_exts[i].split); midx_exts[i].split);


if (link(from.buf, to.buf) < 0 && errno != ENOENT) { if (link(from.buf, to.buf) < 0 && errno != ENOENT) {
@ -1109,7 +1110,7 @@ static int write_midx_internal(struct odb_source *source,
if (flags & MIDX_WRITE_BITMAP && load_midx_revindex(m)) { if (flags & MIDX_WRITE_BITMAP && load_midx_revindex(m)) {
error(_("could not load reverse index for MIDX %s"), error(_("could not load reverse index for MIDX %s"),
hash_to_hex_algop(get_midx_checksum(m), hash_to_hex_algop(get_midx_checksum(m),
m->repo->hash_algo)); m->source->odb->repo->hash_algo));
result = 1; result = 1;
goto cleanup; goto cleanup;
} }

21
midx.c
View File

@ -26,7 +26,7 @@ int cmp_idx_or_pack_name(const char *idx_or_pack_name,


const unsigned char *get_midx_checksum(struct multi_pack_index *m) const unsigned char *get_midx_checksum(struct multi_pack_index *m)
{ {
return m->data + m->data_len - m->repo->hash_algo->rawsz; return m->data + m->data_len - m->source->odb->repo->hash_algo->rawsz;
} }


void get_midx_filename(const struct git_hash_algo *hash_algo, void get_midx_filename(const struct git_hash_algo *hash_algo,
@ -128,11 +128,10 @@ static struct multi_pack_index *load_multi_pack_index_one(struct odb_source *sou
midx_map = xmmap(NULL, midx_size, PROT_READ, MAP_PRIVATE, fd, 0); midx_map = xmmap(NULL, midx_size, PROT_READ, MAP_PRIVATE, fd, 0);
close(fd); close(fd);


FLEX_ALLOC_STR(m, object_dir, source->path); CALLOC_ARRAY(m, 1);
m->data = midx_map; m->data = midx_map;
m->data_len = midx_size; m->data_len = midx_size;
m->local = source->local; m->source = source;
m->repo = r;


m->signature = get_be32(m->data); m->signature = get_be32(m->data);
if (m->signature != MIDX_SIGNATURE) if (m->signature != MIDX_SIGNATURE)
@ -446,7 +445,7 @@ static uint32_t midx_for_pack(struct multi_pack_index **_m,
int prepare_midx_pack(struct multi_pack_index *m, int prepare_midx_pack(struct multi_pack_index *m,
uint32_t pack_int_id) uint32_t pack_int_id)
{ {
struct repository *r = m->repo; struct repository *r = m->source->odb->repo;
struct strbuf pack_name = STRBUF_INIT; struct strbuf pack_name = STRBUF_INIT;
struct strbuf key = STRBUF_INIT; struct strbuf key = STRBUF_INIT;
struct packed_git *p; struct packed_git *p;
@ -458,7 +457,7 @@ int prepare_midx_pack(struct multi_pack_index *m,
if (m->packs[pack_int_id]) if (m->packs[pack_int_id])
return 0; return 0;


strbuf_addf(&pack_name, "%s/pack/%s", m->object_dir, strbuf_addf(&pack_name, "%s/pack/%s", m->source->path,
m->pack_names[pack_int_id]); m->pack_names[pack_int_id]);


/* pack_map holds the ".pack" name, but we have the .idx */ /* pack_map holds the ".pack" name, but we have the .idx */
@ -469,7 +468,8 @@ int prepare_midx_pack(struct multi_pack_index *m,
strhash(key.buf), key.buf, strhash(key.buf), key.buf,
struct packed_git, packmap_ent); struct packed_git, packmap_ent);
if (!p) { if (!p) {
p = add_packed_git(r, pack_name.buf, pack_name.len, m->local); p = add_packed_git(r, pack_name.buf, pack_name.len,
m->source->local);
if (p) { if (p) {
install_packed_git(r, p); install_packed_git(r, p);
list_add_tail(&p->mru, &r->objects->packed_git_mru); list_add_tail(&p->mru, &r->objects->packed_git_mru);
@ -528,7 +528,8 @@ int bsearch_one_midx(const struct object_id *oid, struct multi_pack_index *m,
uint32_t *result) uint32_t *result)
{ {
int ret = bsearch_hash(oid->hash, m->chunk_oid_fanout, int ret = bsearch_hash(oid->hash, m->chunk_oid_fanout,
m->chunk_oid_lookup, m->repo->hash_algo->rawsz, m->chunk_oid_lookup,
m->source->odb->repo->hash_algo->rawsz,
result); result);
if (result) if (result)
*result += m->num_objects_in_base; *result += m->num_objects_in_base;
@ -559,7 +560,7 @@ struct object_id *nth_midxed_object_oid(struct object_id *oid,
n = midx_for_object(&m, n); n = midx_for_object(&m, n);


oidread(oid, m->chunk_oid_lookup + st_mult(m->hash_len, n), oidread(oid, m->chunk_oid_lookup + st_mult(m->hash_len, n),
m->repo->hash_algo); m->source->odb->repo->hash_algo);
return oid; return oid;
} }


@ -734,7 +735,7 @@ int prepare_multi_pack_index_one(struct odb_source *source)


int midx_checksum_valid(struct multi_pack_index *m) int midx_checksum_valid(struct multi_pack_index *m)
{ {
return hashfile_checksum_valid(m->repo->hash_algo, return hashfile_checksum_valid(m->source->odb->repo->hash_algo,
m->data, m->data_len); m->data, m->data_len);
} }



7
midx.h
View File

@ -35,6 +35,8 @@ struct odb_source;
"GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL" "GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL"


struct multi_pack_index { struct multi_pack_index {
struct odb_source *source;

const unsigned char *data; const unsigned char *data;
size_t data_len; size_t data_len;


@ -50,7 +52,6 @@ struct multi_pack_index {
uint32_t num_objects; uint32_t num_objects;
int preferred_pack_idx; int preferred_pack_idx;


int local;
int has_chain; int has_chain;


const unsigned char *chunk_pack_names; const unsigned char *chunk_pack_names;
@ -71,10 +72,6 @@ struct multi_pack_index {


const char **pack_names; const char **pack_names;
struct packed_git **packs; struct packed_git **packs;

struct repository *repo;

char object_dir[FLEX_ARRAY];
}; };


#define MIDX_PROGRESS (1 << 0) #define MIDX_PROGRESS (1 << 0)

View File

@ -216,7 +216,7 @@ static uint32_t bitmap_num_objects(struct bitmap_index *index)
static struct repository *bitmap_repo(struct bitmap_index *bitmap_git) static struct repository *bitmap_repo(struct bitmap_index *bitmap_git)
{ {
if (bitmap_is_midx(bitmap_git)) if (bitmap_is_midx(bitmap_git))
return bitmap_git->midx->repo; return bitmap_git->midx->source->odb->repo;
return bitmap_git->pack->repo; return bitmap_git->pack->repo;
} }


@ -418,13 +418,13 @@ char *midx_bitmap_filename(struct multi_pack_index *midx)
{ {
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
if (midx->has_chain) if (midx->has_chain)
get_split_midx_filename_ext(midx->repo->hash_algo, &buf, get_split_midx_filename_ext(midx->source->odb->repo->hash_algo, &buf,
midx->object_dir, midx->source->path,
get_midx_checksum(midx), get_midx_checksum(midx),
MIDX_EXT_BITMAP); MIDX_EXT_BITMAP);
else else
get_midx_filename_ext(midx->repo->hash_algo, &buf, get_midx_filename_ext(midx->source->odb->repo->hash_algo, &buf,
midx->object_dir, get_midx_checksum(midx), midx->source->path, get_midx_checksum(midx),
MIDX_EXT_BITMAP); MIDX_EXT_BITMAP);


return strbuf_detach(&buf, NULL); return strbuf_detach(&buf, NULL);
@ -463,7 +463,8 @@ static int open_midx_bitmap_1(struct bitmap_index *bitmap_git,


if (bitmap_git->pack || bitmap_git->midx) { if (bitmap_git->pack || bitmap_git->midx) {
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
get_midx_filename(midx->repo->hash_algo, &buf, midx->object_dir); get_midx_filename(midx->source->odb->repo->hash_algo, &buf,
midx->source->path);
trace2_data_string("bitmap", bitmap_repo(bitmap_git), trace2_data_string("bitmap", bitmap_repo(bitmap_git),
"ignoring extra midx bitmap file", buf.buf); "ignoring extra midx bitmap file", buf.buf);
close(fd); close(fd);

View File

@ -379,25 +379,25 @@ int load_midx_revindex(struct multi_pack_index *m)
* not want to accidentally call munmap() in the middle of the * not want to accidentally call munmap() in the middle of the
* MIDX. * MIDX.
*/ */
trace2_data_string("load_midx_revindex", m->repo, trace2_data_string("load_midx_revindex", m->source->odb->repo,
"source", "midx"); "source", "midx");
m->revindex_data = (const uint32_t *)m->chunk_revindex; m->revindex_data = (const uint32_t *)m->chunk_revindex;
return 0; return 0;
} }


trace2_data_string("load_midx_revindex", m->repo, trace2_data_string("load_midx_revindex", m->source->odb->repo,
"source", "rev"); "source", "rev");


if (m->has_chain) if (m->has_chain)
get_split_midx_filename_ext(m->repo->hash_algo, &revindex_name, get_split_midx_filename_ext(m->source->odb->repo->hash_algo, &revindex_name,
m->object_dir, get_midx_checksum(m), m->source->path, get_midx_checksum(m),
MIDX_EXT_REV); MIDX_EXT_REV);
else else
get_midx_filename_ext(m->repo->hash_algo, &revindex_name, get_midx_filename_ext(m->source->odb->repo->hash_algo, &revindex_name,
m->object_dir, get_midx_checksum(m), m->source->path, get_midx_checksum(m),
MIDX_EXT_REV); MIDX_EXT_REV);


ret = load_revindex_from_disk(m->repo->hash_algo, ret = load_revindex_from_disk(m->source->odb->repo->hash_algo,
revindex_name.buf, revindex_name.buf,
m->num_objects, m->num_objects,
&m->revindex_map, &m->revindex_map,

View File

@ -66,7 +66,7 @@ static int read_midx_file(const char *object_dir, const char *checksum,
for (i = 0; i < m->num_packs; i++) for (i = 0; i < m->num_packs; i++)
printf("%s\n", m->pack_names[i]); printf("%s\n", m->pack_names[i]);


printf("object-dir: %s\n", m->object_dir); printf("object-dir: %s\n", m->source->path);


if (show_objects) { if (show_objects) {
struct object_id oid; struct object_id oid;