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>
This commit is contained in:
Patrick Steinhardt
2025-09-23 12:17:04 +02:00
committed by Junio C Hamano
parent 14aaf5c9d8
commit fe835b0ca0
5 changed files with 10 additions and 12 deletions

2
midx.c
View File

@@ -468,7 +468,7 @@ int prepare_midx_pack(struct multi_pack_index *m,
m->source->local); 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->packfiles->mru);
} }
} }

2
odb.c
View File

@@ -997,7 +997,6 @@ struct object_database *odb_new(struct repository *repo)
memset(o, 0, sizeof(*o)); memset(o, 0, sizeof(*o));
o->repo = repo; o->repo = repo;
o->packfiles = packfile_store_new(o); o->packfiles = packfile_store_new(o);
INIT_LIST_HEAD(&o->packed_git_mru);
pthread_mutex_init(&o->replace_mutex, NULL); pthread_mutex_init(&o->replace_mutex, NULL);
string_list_init_dup(&o->submodule_source_paths); string_list_init_dup(&o->submodule_source_paths);
return o; return o;
@@ -1035,7 +1034,6 @@ void odb_clear(struct object_database *o)
free((char *) o->cached_objects[i].value.buf); free((char *) o->cached_objects[i].value.buf);
FREE_AND_NULL(o->cached_objects); FREE_AND_NULL(o->cached_objects);
INIT_LIST_HEAD(&o->packed_git_mru);
close_object_store(o); close_object_store(o);
packfile_store_free(o->packfiles); packfile_store_free(o->packfiles);
o->packfiles = NULL; o->packfiles = NULL;

4
odb.h
View File

@@ -3,7 +3,6 @@
#include "hashmap.h" #include "hashmap.h"
#include "object.h" #include "object.h"
#include "list.h"
#include "oidset.h" #include "oidset.h"
#include "oidmap.h" #include "oidmap.h"
#include "string-list.h" #include "string-list.h"
@@ -138,9 +137,6 @@ struct object_database {
* Should only be accessed directly by packfile.c and midx.c. * Should only be accessed directly by packfile.c and midx.c.
*/ */
struct packfile_store *packfiles; struct packfile_store *packfiles;
/* A most-recently-used ordered version of the packed_git list. */
struct list_head packed_git_mru;
struct { struct {
struct packed_git **packs; struct packed_git **packs;
unsigned flags; unsigned flags;

View File

@@ -1017,10 +1017,10 @@ static void prepare_packed_git_mru(struct repository *r)
{ {
struct packed_git *p; struct packed_git *p;
INIT_LIST_HEAD(&r->objects->packed_git_mru); INIT_LIST_HEAD(&r->objects->packfiles->mru);
for (p = r->objects->packfiles->packs; p; p = p->next) for (p = r->objects->packfiles->packs; p; p = p->next)
list_add_tail(&p->mru, &r->objects->packed_git_mru); list_add_tail(&p->mru, &r->objects->packfiles->mru);
} }
static void prepare_packed_git(struct repository *r) static void prepare_packed_git(struct repository *r)
@@ -1095,7 +1095,7 @@ struct packed_git *get_all_packs(struct repository *r)
struct list_head *get_packed_git_mru(struct repository *r) struct list_head *get_packed_git_mru(struct repository *r)
{ {
prepare_packed_git(r); prepare_packed_git(r);
return &r->objects->packed_git_mru; return &r->objects->packfiles->mru;
} }
unsigned long unpack_object_header_buffer(const unsigned char *buf, 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
if (!r->objects->packfiles->packs) if (!r->objects->packfiles->packs)
return 0; return 0;
list_for_each(pos, &r->objects->packed_git_mru) { list_for_each(pos, &r->objects->packfiles->mru) {
struct packed_git *p = list_entry(pos, struct packed_git, mru); struct packed_git *p = list_entry(pos, struct packed_git, mru);
if (!p->multi_pack_index && fill_pack_entry(oid, e, p)) { if (!p->multi_pack_index && fill_pack_entry(oid, e, p)) {
list_move(&p->mru, &r->objects->packed_git_mru); list_move(&p->mru, &r->objects->packfiles->mru);
return 1; return 1;
} }
} }
@@ -2347,6 +2347,7 @@ struct packfile_store *packfile_store_new(struct object_database *odb)
struct packfile_store *store; struct packfile_store *store;
CALLOC_ARRAY(store, 1); CALLOC_ARRAY(store, 1);
store->odb = odb; store->odb = odb;
INIT_LIST_HEAD(&store->mru);
hashmap_init(&store->map, pack_map_entry_cmp, NULL, 0); hashmap_init(&store->map, pack_map_entry_cmp, NULL, 0);
return store; return store;
} }

View File

@@ -64,6 +64,9 @@ struct packfile_store {
*/ */
struct packed_git *packs; struct packed_git *packs;
/* A most-recently-used ordered version of the packs list. */
struct list_head mru;
/* /*
* A map of packfile names to packed_git structs for tracking which * A map of packfile names to packed_git structs for tracking which
* packs have been loaded already. * packs have been loaded already.