From 8759a6c25813db55893e30cb37c20b78239a53d0 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Mon, 23 Feb 2026 17:17:59 +0100 Subject: [PATCH] odb/source: make `close()` function pluggable Introduce a new callback function in `struct odb_source` to make the function pluggable. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- odb.c | 6 ++---- odb/source-files.c | 7 +++++++ odb/source.h | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/odb.c b/odb.c index 2cf6a53dc3..f7487eb0df 100644 --- a/odb.c +++ b/odb.c @@ -1062,10 +1062,8 @@ struct object_database *odb_new(struct repository *repo, void odb_close(struct object_database *o) { struct odb_source *source; - for (source = o->sources; source; source = source->next) { - struct odb_source_files *files = odb_source_files_downcast(source); - packfile_store_close(files->packed); - } + for (source = o->sources; source; source = source->next) + odb_source_close(source); close_commit_graph(o); } diff --git a/odb/source-files.c b/odb/source-files.c index d0f7ee072e..20a24f524a 100644 --- a/odb/source-files.c +++ b/odb/source-files.c @@ -28,6 +28,12 @@ static void odb_source_files_free(struct odb_source *source) free(files); } +static void odb_source_files_close(struct odb_source *source) +{ + struct odb_source_files *files = odb_source_files_downcast(source); + packfile_store_close(files->packed); +} + static void odb_source_files_reprepare(struct odb_source *source) { struct odb_source_files *files = odb_source_files_downcast(source); @@ -47,6 +53,7 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb, files->packed = packfile_store_new(&files->base); files->base.free = odb_source_files_free; + files->base.close = odb_source_files_close; files->base.reprepare = odb_source_files_reprepare; /* diff --git a/odb/source.h b/odb/source.h index 2f8132f9e1..7af4900ab4 100644 --- a/odb/source.h +++ b/odb/source.h @@ -59,6 +59,14 @@ struct odb_source { */ void (*free)(struct odb_source *source); + /* + * This callback is expected to close any open resources, like for + * example file descriptors or connections. The source is expected to + * still be usable after it has been closed. Closed resources may need + * to be reopened in that case. + */ + void (*close)(struct odb_source *source); + /* * This callback is expected to clear underlying caches of the object * database source. The function is called when the repository has for @@ -104,6 +112,16 @@ void odb_source_free(struct odb_source *source); */ void odb_source_release(struct odb_source *source); +/* + * Close the object database source without releasing he underlying data. The + * source can still be used going forward, but it first needs to be reopened. + * This can be useful to reduce resource usage. + */ +static inline void odb_source_close(struct odb_source *source) +{ + source->close(source); +} + /* * Reprepare the object database source and clear any caches. Depending on the * backend used this may have the effect that concurrently-written objects