odb: move kept cache into struct packfile_store

The object database tracks a cache of "kept" packfiles, which is used by
git-pack-objects(1) to handle cruft objects. With the introduction of
the `struct packfile_store` we have a better place to host this cache
though.

Move the cache accordingly.

This moves the last bit of packfile-related state from the object
database into the packfile store. Adapt the comment for the `packfiles`
pointer in `struct object_database` to reflect this.

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:05 +02:00
committed by Junio C Hamano
parent fe835b0ca0
commit bd1a521de8
3 changed files with 23 additions and 17 deletions

10
odb.h
View File

@@ -131,16 +131,8 @@ struct object_database {
struct commit_graph *commit_graph; struct commit_graph *commit_graph;
unsigned commit_graph_attempted : 1; /* if loading has been attempted */ unsigned commit_graph_attempted : 1; /* if loading has been attempted */
/* /* Should only be accessed directly by packfile.c and midx.c. */
* private data
*
* Should only be accessed directly by packfile.c and midx.c.
*/
struct packfile_store *packfiles; struct packfile_store *packfiles;
struct {
struct packed_git **packs;
unsigned flags;
} kept_pack_cache;
/* /*
* This is meant to hold a *small* number of objects that you would * This is meant to hold a *small* number of objects that you would

View File

@@ -2091,19 +2091,19 @@ int find_pack_entry(struct repository *r, const struct object_id *oid, struct pa
static void maybe_invalidate_kept_pack_cache(struct repository *r, static void maybe_invalidate_kept_pack_cache(struct repository *r,
unsigned flags) unsigned flags)
{ {
if (!r->objects->kept_pack_cache.packs) if (!r->objects->packfiles->kept_cache.packs)
return; return;
if (r->objects->kept_pack_cache.flags == flags) if (r->objects->packfiles->kept_cache.flags == flags)
return; return;
FREE_AND_NULL(r->objects->kept_pack_cache.packs); FREE_AND_NULL(r->objects->packfiles->kept_cache.packs);
r->objects->kept_pack_cache.flags = 0; r->objects->packfiles->kept_cache.flags = 0;
} }
struct packed_git **kept_pack_cache(struct repository *r, unsigned flags) struct packed_git **kept_pack_cache(struct repository *r, unsigned flags)
{ {
maybe_invalidate_kept_pack_cache(r, flags); maybe_invalidate_kept_pack_cache(r, flags);
if (!r->objects->kept_pack_cache.packs) { if (!r->objects->packfiles->kept_cache.packs) {
struct packed_git **packs = NULL; struct packed_git **packs = NULL;
size_t nr = 0, alloc = 0; size_t nr = 0, alloc = 0;
struct packed_git *p; struct packed_git *p;
@@ -2126,11 +2126,11 @@ struct packed_git **kept_pack_cache(struct repository *r, unsigned flags)
ALLOC_GROW(packs, nr + 1, alloc); ALLOC_GROW(packs, nr + 1, alloc);
packs[nr] = NULL; packs[nr] = NULL;
r->objects->kept_pack_cache.packs = packs; r->objects->packfiles->kept_cache.packs = packs;
r->objects->kept_pack_cache.flags = flags; r->objects->packfiles->kept_cache.flags = flags;
} }
return r->objects->kept_pack_cache.packs; return r->objects->packfiles->kept_cache.packs;
} }
int find_kept_pack_entry(struct repository *r, int find_kept_pack_entry(struct repository *r,

View File

@@ -64,6 +64,20 @@ struct packfile_store {
*/ */
struct packed_git *packs; struct packed_git *packs;
/*
* Cache of packfiles which are marked as "kept", either because there
* is an on-disk ".keep" file or because they are marked as "kept" in
* memory.
*
* Should not be accessed directly, but via `kept_pack_cache()`. The
* list of packs gets invalidated when the stored flags and the flags
* passed to `kept_pack_cache()` mismatch.
*/
struct {
struct packed_git **packs;
unsigned flags;
} kept_cache;
/* A most-recently-used ordered version of the packs list. */ /* A most-recently-used ordered version of the packs list. */
struct list_head mru; struct list_head mru;