Show 70 quoted lines
> Information about a object database's packfiles is currently distributed
> across two different structures:
>
> - `struct packed_git` contains the `next` pointer as well as the
> `mru_head`, both of which serve to store the list of packfiles.
>
> - `struct object_database` contains several fields that relate to the
> packfiles.
>
> So we don't really have a central data structure that tracks our
> packfiles, and consequently responsibilities aren't always clear cut.
> A consequence for the upcoming pluggable object databases is that this
> makes it very hard to move management of packfiles from the object
> database level down into the object database source.
>
> Introduce a new `struct packfile_store` which is about to become the
> single source of truth for managing packfiles. Right now this data
> structure doesn't yet contain anything, but in subsequent patches we
> will move all data structures that relate to packfiles and that are
> currently contained in `struct object_database` into this new home.
>
> Note that this is only a first step: most importantly, we won't (yet)
> move the `struct packed_git::next` pointer around. This will happen in a
> subsequent patch series though so that `struct packed_git` will really
> only host information about the specific packfile it represents.
>
> Further note that the new structure still sits at the wrong level at the
> end of this patch series: as mentioned, it should eventually sit at the
> level of the object database source, not at the object database level.
> But introducing the packfile store now already makes it way easier to
> eventually push down the now-selfcontained data structure by one level.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> odb.c | 1 +
> odb.h | 2 ++
> packfile.c | 13 +++++++++++++
> packfile.h | 18 ++++++++++++++++++
> 4 files changed, 34 insertions(+)
>
> diff --git a/odb.c b/odb.c
> index 2a92a018c4..34b70d0074 100644
> --- a/odb.c
> +++ b/odb.c
> @@ -996,6 +996,7 @@ struct object_database *odb_new(struct repository *repo)
>
> memset(o, 0, sizeof(*o));
> o->repo = repo;
> + o->packfiles = packfile_store_new(o);
> INIT_LIST_HEAD(&o->packed_git_mru);
> hashmap_init(&o->pack_map, pack_map_entry_cmp, NULL, 0);
> pthread_mutex_init(&o->replace_mutex, NULL);
> diff --git a/odb.h b/odb.h
> index 3dfc66d75a..026ba9386d 100644
> --- a/odb.h
> +++ b/odb.h
> @@ -83,6 +83,7 @@ struct odb_source {
> };
>
> struct packed_git;
> +struct packfile_store;
> struct cached_object_entry;
>
> /*
> @@ -128,6 +129,7 @@ struct object_database {
> *
> * should only be accessed directly by packfile.c
> */
> + struct packfile_store *packfiles;
>