packfile: create store via its owning source

In subsequent patches we're about to move the packfile store from the
object database layer into the object database source layer. Once done,
we'll have one packfile store per source, where the source is owning the
store.

Prepare for this future and refactor `packfile_store_new()` to be
initialized via an object database source instead of via the object
database itself.

This refactoring leads to a weird in-between state where the store is
owned by the object database but created via the source. But this makes
subsequent refactorings easier because we can now start to access the
owning source of a given store.

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-12-18 07:55:20 +01:00 committed by Junio C Hamano
parent f1ec43d4d2
commit 34c19c7a2b
3 changed files with 14 additions and 14 deletions

2
odb.c
View File

@ -1056,7 +1056,6 @@ struct object_database *odb_new(struct repository *repo,
memset(o, 0, sizeof(*o));
o->repo = repo;
o->packfiles = packfile_store_new(o);
pthread_mutex_init(&o->replace_mutex, NULL);
string_list_init_dup(&o->submodule_source_paths);
@ -1065,6 +1064,7 @@ struct object_database *odb_new(struct repository *repo,
o->sources = odb_source_new(o, primary_source, true);
o->sources_tail = &o->sources->next;
o->alternate_db = xstrdup_or_null(secondary_sources);
o->packfiles = packfile_store_new(o->sources);
free(to_free);

View File

@ -876,7 +876,7 @@ struct packed_git *packfile_store_load_pack(struct packfile_store *store,
p = strmap_get(&store->packs_by_path, key.buf);
if (!p) {
p = add_packed_git(store->odb->repo, idx_path,
p = add_packed_git(store->source->odb->repo, idx_path,
strlen(idx_path), local);
if (p)
packfile_store_add_pack(store, p);
@ -1068,8 +1068,8 @@ void packfile_store_prepare(struct packfile_store *store)
if (store->initialized)
return;
odb_prepare_alternates(store->odb);
for (source = store->odb->sources; source; source = source->next) {
odb_prepare_alternates(store->source->odb);
for (source = store->source->odb->sources; source; source = source->next) {
prepare_multi_pack_index_one(source);
prepare_packed_git_one(source);
}
@ -1092,7 +1092,7 @@ struct packfile_list_entry *packfile_store_get_packs(struct packfile_store *stor
{
packfile_store_prepare(store);
for (struct odb_source *source = store->odb->sources; source; source = source->next) {
for (struct odb_source *source = store->source->odb->sources; source; source = source->next) {
struct multi_pack_index *m = source->midx;
if (!m)
continue;
@ -2121,7 +2121,7 @@ int packfile_store_freshen_object(struct packfile_store *store,
const struct object_id *oid)
{
struct pack_entry e;
if (!find_pack_entry(store->odb->repo, oid, &e))
if (!find_pack_entry(store->source->odb->repo, oid, &e))
return 0;
if (e.p->is_cruft)
return 0;
@ -2142,7 +2142,7 @@ int packfile_store_read_object_info(struct packfile_store *store,
struct pack_entry e;
int rtype;
if (!find_pack_entry(store->odb->repo, oid, &e))
if (!find_pack_entry(store->source->odb->repo, oid, &e))
return 1;
/*
@ -2152,7 +2152,7 @@ int packfile_store_read_object_info(struct packfile_store *store,
if (oi == &blank_oi)
return 0;
rtype = packed_object_info(store->odb->repo, e.p, e.offset, oi);
rtype = packed_object_info(store->source->odb->repo, e.p, e.offset, oi);
if (rtype < 0) {
mark_bad_packed_object(e.p, oid);
return -1;
@ -2411,11 +2411,11 @@ int parse_pack_header_option(const char *in, unsigned char *out, unsigned int *l
return 0;
}
struct packfile_store *packfile_store_new(struct object_database *odb)
struct packfile_store *packfile_store_new(struct odb_source *source)
{
struct packfile_store *store;
CALLOC_ARRAY(store, 1);
store->odb = odb;
store->source = source;
strmap_init(&store->packs_by_path);
return store;
}
@ -2534,7 +2534,7 @@ int packfile_store_read_object_stream(struct odb_read_stream **out,
if (packfile_store_read_object_info(store, oid, &oi, 0) ||
oi.u.packed.is_delta ||
repo_settings_get_big_file_threshold(store->odb->repo) >= size)
repo_settings_get_big_file_threshold(store->source->odb->repo) >= size)
return -1;
in_pack_type = unpack_object_header(oi.u.packed.pack,

View File

@ -77,7 +77,7 @@ struct packed_git *packfile_list_find_oid(struct packfile_list_entry *packs,
* A store that manages packfiles for a given object database.
*/
struct packfile_store {
struct object_database *odb;
struct odb_source *source;
/*
* The list of packfiles in the order in which they have been most
@ -129,9 +129,9 @@ struct packfile_store {
/*
* Allocate and initialize a new empty packfile store for the given object
* database.
* database source.
*/
struct packfile_store *packfile_store_new(struct object_database *odb);
struct packfile_store *packfile_store_new(struct odb_source *source);
/*
* Free the packfile store and all its associated state. All packfiles