[PATCH v2 07/13] object-file: hide internals when we need to reprepare loose sources
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Oct 31, 2025, 06:12 UTC
- Message-ID
- <20251031-b4-pks-odb-loose-backend-v2-7-920f721aef71@pks.im>
- In-Reply-To
- <20251031-b4-pks-odb-loose-backend-v2-0-920f721aef71@pks.im>
There are two different situations where we have to clear the cache of loose objects:
- When freeing the loose object source itself to avoid memory leaks.
- When repreparing the loose object source so that any potentially-
stale data is getting evicted from the cache.The former is already handled by `odb_loose_source_free()`. But the latter case is still done manually by in `odb_reprepare()`, so we are leaking internals into that code.
Introduce a new `odb_loose_source_reprepare()` function as an equivalent to `packfile_store_prepare()` to hide these implementation details. Furthermore, while at it, rename the function `odb_clear_loose_cache()` to `odb_loose_source_clear()`.
Signed-off-by: Patrick Steinhardt <ps@pks.im> --- object-file.c | 17 +++++++++++------ object-file.h | 6 +++--- odb.c | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/object-file.c b/object-file.c index 8a3db2877ee..2b908dc1215 100644 --- a/object-file.c +++ b/object-file.c @@ -1834,12 +1834,17 @@ struct oidtree *odb_loose_source_cache(struct odb_source *source, return source->loose->cache; } -void odb_clear_loose_cache(struct odb_source *source) +static void odb_loose_source_clear_cache(struct odb_loose_source *loose) { - oidtree_clear(source->loose->cache); - FREE_AND_NULL(source->loose->cache); - memset(&source->loose->subdir_seen, 0, - sizeof(source->loose->subdir_seen)); + oidtree_clear(loose->cache); + FREE_AND_NULL(loose->cache); + memset(&loose->subdir_seen, 0, + sizeof(loose->subdir_seen)); +} + +void odb_loose_source_reprepare(struct odb_source *source) +{ + odb_loose_source_clear_cache(source->loose); } static int check_stream_oid(git_zstream *stream, @@ -2008,6 +2013,6 @@ void odb_loose_source_free(struct odb_loose_source *loose) { if (!loose) return; - odb_clear_loose_cache(loose->source); + odb_loose_source_clear_cache(loose); free(loose); } diff --git a/object-file.h b/object-file.h index 887b48725a0..6cbb4b44352 100644 --- a/object-file.h +++ b/object-file.h @@ -37,6 +37,9 @@ struct odb_loose_source { struct odb_loose_source *odb_loose_source_new(struct odb_source *source); void odb_loose_source_free(struct odb_loose_source *loose); +/* Reprepare the loose source by emptying the loose object cache. */ +void odb_loose_source_reprepare(struct odb_source *source); + /* * Populate and return the loose object cache array corresponding to the * given object ID. @@ -44,9 +47,6 @@ void odb_loose_source_free(struct odb_loose_source *loose); struct oidtree *odb_loose_source_cache(struct odb_source *source, const struct object_id *oid); -/* Empty the loose object cache for the specified object directory. */ -void odb_clear_loose_cache(struct odb_source *source); - /* * Put in `buf` the name of the file in the local object database that * would be used to store a loose object with the specified oid. diff --git a/odb.c b/odb.c index 5a5e770dcd0..b4196f0b323 100644 --- a/odb.c +++ b/odb.c @@ -1071,7 +1071,7 @@ void odb_reprepare(struct object_database *o) odb_prepare_alternates(o); for (source = o->sources; source; source = source->next) - odb_clear_loose_cache(source); + odb_loose_source_reprepare(source); o->approximate_object_count_valid = 0;
-- 2.51.2.1041.gc1ab5b90ca.dirty