aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2026-03-05 15:19:48 +0100
committerJunio C Hamano <gitster@pobox.com>2026-03-05 11:45:15 -0800
commit3bc3177ad7a472dd5fc45cff16b8f57e5800ebc2 (patch)
treede69cb8d12c523123cbe61a6bb0e069811f269a7
parent05151cf3602d5ebaaa4e04c415e8481cb1c7ddf6 (diff)
downloadgit-3bc3177ad7a472dd5fc45cff16b8f57e5800ebc2.tar.xz
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 <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--odb.c6
-rw-r--r--odb/source-files.c7
-rw-r--r--odb/source.h18
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 09cca839fe..0e6c6abdb1 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
* example just been repacked so that new objects will become visible.
@@ -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
* become visible.