git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 1/4] odb: store ODB source in `struct odb_transaction`

From
Justin Tobler <jltobler@gmail.com>
Date
Feb 3, 2026, 00:09 UTC
Message-ID
<20260203001002.2500198-2-jltobler@gmail.com>
In-Reply-To
<20260203001002.2500198-1-jltobler@gmail.com>

Each `struct odb_transaction` currently stores a reference to the `struct object_database`. Since transactions are handled per object source, instead store a reference to the source.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
---
 object-file.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/object-file.c b/object-file.c
index e7e4c3348f..196509b252 100644
--- a/object-file.c
+++ b/object-file.c
@@ -711,7 +711,7 @@ struct transaction_packfile {
 };
 
 struct odb_transaction {
-	struct object_database *odb;
+	struct odb_source *source;
 
 	struct tmp_objdir *objdir;
 	struct transaction_packfile packfile;
@@ -728,7 +728,7 @@ static void prepare_loose_object_transaction(struct odb_transaction *transaction
 	if (!transaction || transaction->objdir)
 		return;
 
-	transaction->objdir = tmp_objdir_create(transaction->odb->repo, "bulk-fsync");
+	transaction->objdir = tmp_objdir_create(transaction->source->odb->repo, "bulk-fsync");
 	if (transaction->objdir)
 		tmp_objdir_replace_primary_odb(transaction->objdir, 0);
 }
@@ -772,7 +772,7 @@ static void flush_loose_object_transaction(struct odb_transaction *transaction)
 	 * the final name is visible.
 	 */
 	strbuf_addf(&temp_path, "%s/bulk_fsync_XXXXXX",
-		    repo_get_object_directory(transaction->odb->repo));
+		    repo_get_object_directory(transaction->source->odb->repo));
 	temp = xmks_tempfile(temp_path.buf);
 	fsync_or_die(get_tempfile_fd(temp), get_tempfile_path(temp));
 	delete_tempfile(&temp);
@@ -1344,7 +1344,7 @@ static int already_written(struct odb_transaction *transaction,
 			   struct object_id *oid)
 {
 	/* The object may already exist in the repository */
-	if (odb_has_object(transaction->odb, oid,
+	if (odb_has_object(transaction->source->odb, oid,
 			   HAS_OBJECT_RECHECK_PACKED | HAS_OBJECT_FETCH_PROMISOR))
 		return 1;
 
@@ -1365,7 +1365,7 @@ static void prepare_packfile_transaction(struct odb_transaction *transaction,
 	if (!(flags & INDEX_WRITE_OBJECT) || state->f)
 		return;
 
-	state->f = create_tmp_packfile(transaction->odb->repo,
+	state->f = create_tmp_packfile(transaction->source->odb->repo,
 				       &state->pack_tmp_name);
 	reset_pack_idx_option(&state->pack_idx_opts);
 
@@ -1469,7 +1469,7 @@ static int stream_blob_to_pack(struct transaction_packfile *state,
 static void flush_packfile_transaction(struct odb_transaction *transaction)
 {
 	struct transaction_packfile *state = &transaction->packfile;
-	struct repository *repo = transaction->odb->repo;
+	struct repository *repo = transaction->source->odb->repo;
 	unsigned char hash[GIT_MAX_RAWSZ];
 	struct strbuf packname = STRBUF_INIT;
 	char *idx_tmp_name = NULL;
@@ -1494,7 +1494,7 @@ static void flush_packfile_transaction(struct odb_transaction *transaction)
 	}
 
 	strbuf_addf(&packname, "%s/pack/pack-%s.",
-		    repo_get_object_directory(transaction->odb->repo),
+		    repo_get_object_directory(transaction->source->odb->repo),
 		    hash_to_hex_algop(hash, repo->hash_algo));
 
 	stage_tmp_packfiles(repo, &packname, state->pack_tmp_name,
@@ -1553,7 +1553,7 @@ static int index_blob_packfile_transaction(struct odb_transaction *transaction,
 
 	header_len = format_object_header((char *)obuf, sizeof(obuf),
 					  OBJ_BLOB, size);
-	transaction->odb->repo->hash_algo->init_fn(&ctx);
+	transaction->source->odb->repo->hash_algo->init_fn(&ctx);
 	git_hash_update(&ctx, obuf, header_len);
 
 	/* Note: idx is non-NULL when we are writing */
@@ -1993,7 +1993,7 @@ struct odb_transaction *object_file_transaction_begin(struct odb_source *source)
 		return NULL;
 
 	CALLOC_ARRAY(odb->transaction, 1);
-	odb->transaction->odb = odb;
+	odb->transaction->source = source;
 
 	return odb->transaction;
 }
@@ -2006,11 +2006,11 @@ void object_file_transaction_commit(struct odb_transaction *transaction)
 	/*
 	 * Ensure the transaction ending matches the pending transaction.
 	 */
-	ASSERT(transaction == transaction->odb->transaction);
+	ASSERT(transaction == transaction->source->odb->transaction);
 
 	flush_loose_object_transaction(transaction);
 	flush_packfile_transaction(transaction);
-	transaction->odb->transaction = NULL;
+	transaction->source->odb->transaction = NULL;
 	free(transaction);
 }
 
-- 
2.52.0.373.g68cb7f9e92
Previous: Justin ToblerNext: Justin Tobler
Message 16 of 32 in “odb: support ODB source specific transaction handling”
  1. 0/4 odb: support ODB source specific transaction handlingJustin Tobler, Jan 28, 2026
  2. 1/4 odb: store ODB source in `struct odb_transaction`Justin Tobler, Jan 28, 2026
  3. Patrick SteinhardtJan 29, 2026
  4. Junio C HamanoJan 29, 2026
  5. Justin ToblerJan 29, 2026
  6. Junio C HamanoJan 29, 2026
  7. Justin ToblerJan 29, 2026
  8. Justin ToblerJan 29, 2026
  9. 2/4 object-file: rename transaction functionsJustin Tobler, Jan 28, 2026
  10. 3/4 odb: prepare `struct odb_transaction` to support more sourcesJustin Tobler, Jan 28, 2026
  11. Patrick SteinhardtJan 29, 2026
  12. Justin ToblerJan 29, 2026
  13. 4/4 odb: transparently handle common transaction behaviorJustin Tobler, Jan 28, 2026
  14. Patrick SteinhardtJan 29, 2026
  15. 0/4 odb: support ODB source specific transaction handlingJustin Tobler, Feb 3, 2026
  16. 1/4 odb: store ODB source in `struct odb_transaction`Justin Tobler, Feb 3, 2026
  17. 2/4 object-file: rename transaction functionsJustin Tobler, Feb 3, 2026
  18. 3/4 odb: prepare `struct odb_transaction` to become genericJustin Tobler, Feb 3, 2026
  19. Toon ClaesFeb 3, 2026
  20. Justin ToblerFeb 3, 2026
  21. Junio C HamanoFeb 3, 2026
  22. Patrick SteinhardtFeb 4, 2026
  23. Justin ToblerFeb 4, 2026
  24. Karthik NayakFeb 4, 2026
  25. Justin ToblerFeb 4, 2026
  26. Karthik NayakFeb 5, 2026
  27. 4/4 odb: transparently handle common transaction behaviorJustin Tobler, Feb 3, 2026
  28. Karthik NayakFeb 4, 2026
  29. Justin ToblerFeb 4, 2026
  30. Karthik NayakFeb 5, 2026
  31. Junio C HamanoFeb 3, 2026
  32. Patrick SteinhardtFeb 4, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.