From 4d8be89d973b69a826911385c5cf3d40d347394b Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Tue, 15 Jul 2025 13:29:18 +0200 Subject: midx: start tracking per object database source Multi-pack indices are tracked via `struct multi_pack_index`. This data structure is stored as a linked list inside `struct object_database`, which is the global database that spans across all of the object sources. This layout causes two problems: - Object databases consist of multiple object sources (e.g. one source per alternate object directory), where each multi-pack index is specific to one of those sources. Regardless of that though, the MIDX is not tracked per source, but tracked globally for the whole object database. This creates a mismatch between the on-disk layout and how things are organized in the object database subsystems and makes some parts, like figuring out whether a source has an MIDX, quite awkward. - Multi-pack indices are an implementation detail of how efficient access for packfiles work. As such, they are neither relevant in the context of loose objects, nor in a potential future where we have pluggable backends. Refactor `prepare_multi_pack_index_one()` so that it works on a specific source, which allows us to easily store a pointer to the multi-pack index inside of it. For now, this pointer exists next to the existing linked list we have in the object database. Users will be adjusted in subsequent patches to instead use the per-source pointers. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- packfile.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'packfile.c') diff --git a/packfile.c b/packfile.c index af9ccfdba6..8bdd85fc7e 100644 --- a/packfile.c +++ b/packfile.c @@ -372,6 +372,8 @@ void close_object_store(struct object_database *o) if (o->multi_pack_index) { close_midx(o->multi_pack_index); o->multi_pack_index = NULL; + for (struct odb_source *source = o->sources; source; source = source->next) + source->midx = NULL; } close_commit_graph(o); @@ -1037,7 +1039,7 @@ static void prepare_packed_git(struct repository *r) odb_prepare_alternates(r->objects); for (source = r->objects->sources; source; source = source->next) { int local = (source == r->objects->sources); - prepare_multi_pack_index_one(r, source->path, local); + prepare_multi_pack_index_one(source, local); prepare_packed_git_one(r, source->path, local); } rearrange_packed_git(r); -- cgit v1.3