odb: move MRU list of packfiles into `struct packfile_store`

The object database tracks the list of packfiles in most-recently-used order, which is mostly used to favor reading from packfiles that contain most of the objects that we're currently accessing. With the introduction of the `struct packfile_store` we have a better place to host this list though. Move the list accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Sep 23, 2025 at 12:17 UTC fe835b0ca0ba4d6968cd2d1f824c178547934792
5 files changed +10 -12
midx.c
+1 -1
@@ -468,7 +468,7 @@ int prepare_midx_pack(struct multi_pack_index *m,
468 m->source->local);
469 if (p) {
470 install_packed_git(r, p);
471 - list_add_tail(&p->mru, &r->objects->packed_git_mru);
471 + list_add_tail(&p->mru, &r->objects->packfiles->mru);
472 }
473 }
474
odb.c
-2
@@ -997,7 +997,6 @@ struct object_database *odb_new(struct repository *repo)
997 memset(o, 0, sizeof(*o));
998 o->repo = repo;
999 o->packfiles = packfile_store_new(o);
1000 - INIT_LIST_HEAD(&o->packed_git_mru);
1000 pthread_mutex_init(&o->replace_mutex, NULL);
1001 string_list_init_dup(&o->submodule_source_paths);
1002 return o;
@@ -1035,7 +1034,6 @@ void odb_clear(struct object_database *o)
1034 free((char *) o->cached_objects[i].value.buf);
1035 FREE_AND_NULL(o->cached_objects);
1036
1038 - INIT_LIST_HEAD(&o->packed_git_mru);
1037 close_object_store(o);
1038 packfile_store_free(o->packfiles);
1039 o->packfiles = NULL;
odb.h
-4
@@ -3,7 +3,6 @@
3
4 #include "hashmap.h"
5 #include "object.h"
6 -#include "list.h"
6 #include "oidset.h"
7 #include "oidmap.h"
8 #include "string-list.h"
@@ -138,9 +137,6 @@ struct object_database {
137 * Should only be accessed directly by packfile.c and midx.c.
138 */
139 struct packfile_store *packfiles;
141 - /* A most-recently-used ordered version of the packed_git list. */
142 - struct list_head packed_git_mru;
143 -
140 struct {
141 struct packed_git **packs;
142 unsigned flags;
packfile.c
+6 -5
@@ -1017,10 +1017,10 @@ static void prepare_packed_git_mru(struct repository *r)
1017 {
1018 struct packed_git *p;
1019
1020 - INIT_LIST_HEAD(&r->objects->packed_git_mru);
1020 + INIT_LIST_HEAD(&r->objects->packfiles->mru);
1021
1022 for (p = r->objects->packfiles->packs; p; p = p->next)
1023 - list_add_tail(&p->mru, &r->objects->packed_git_mru);
1023 + list_add_tail(&p->mru, &r->objects->packfiles->mru);
1024 }
1025
1026 static void prepare_packed_git(struct repository *r)
@@ -1095,7 +1095,7 @@ struct packed_git *get_all_packs(struct repository *r)
1095 struct list_head *get_packed_git_mru(struct repository *r)
1096 {
1097 prepare_packed_git(r);
1098 - return &r->objects->packed_git_mru;
1098 + return &r->objects->packfiles->mru;
1099 }
1100
1101 unsigned long unpack_object_header_buffer(const unsigned char *buf,
@@ -2078,10 +2078,10 @@ int find_pack_entry(struct repository *r, const struct object_id *oid, struct pa
2078 if (!r->objects->packfiles->packs)
2079 return 0;
2080
2081 - list_for_each(pos, &r->objects->packed_git_mru) {
2081 + list_for_each(pos, &r->objects->packfiles->mru) {
2082 struct packed_git *p = list_entry(pos, struct packed_git, mru);
2083 if (!p->multi_pack_index && fill_pack_entry(oid, e, p)) {
2084 - list_move(&p->mru, &r->objects->packed_git_mru);
2084 + list_move(&p->mru, &r->objects->packfiles->mru);
2085 return 1;
2086 }
2087 }
@@ -2347,6 +2347,7 @@ struct packfile_store *packfile_store_new(struct object_database *odb)
2347 struct packfile_store *store;
2348 CALLOC_ARRAY(store, 1);
2349 store->odb = odb;
2350 + INIT_LIST_HEAD(&store->mru);
2351 hashmap_init(&store->map, pack_map_entry_cmp, NULL, 0);
2352 return store;
2353 }
packfile.h
+3
@@ -64,6 +64,9 @@ struct packfile_store {
64 */
65 struct packed_git *packs;
66
67 + /* A most-recently-used ordered version of the packs list. */
68 + struct list_head mru;
69 +
70 /*
71 * A map of packfile names to packed_git structs for tracking which
72 * packs have been loaded already.