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

[PATCH v2 4/4] odb: transparently handle common transaction behavior

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

A new ODB transaction is created and returned via `odb_transaction_begin()` and stored in the ODB. Only a single transaction may be pending at a time. If the ODB already has a transaction, the function is expected to return NULL. Similarly, when committing a transaction via `odb_transaction_commit()` the transaction being committed must match the pending transaction and upon commit reset the ODB transaction to NULL.

These behaviors apply regardless of the ODB transaction implementation. Move the corresponding logic into `odb_transaction_{begin,commit}()` accordingly.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
---
 object-file.c |  9 ---------
 odb.c         | 14 +++++++++++++-
 2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/object-file.c b/object-file.c
index d7e153c1b9..1b62996ef0 100644
--- a/object-file.c
+++ b/object-file.c
@@ -1994,15 +1994,8 @@ static void odb_transaction_files_commit(struct odb_transaction *base)
 {
 	struct odb_transaction_files *transaction = (struct odb_transaction_files *)base;
 
-	/*
-	 * Ensure the transaction ending matches the pending transaction.
-	 */
-	ASSERT(base == base->source->odb->transaction);
-
 	flush_loose_object_transaction(transaction);
 	flush_packfile_transaction(transaction);
-	base->source->odb->transaction = NULL;
-	free(transaction);
 }
 
 struct odb_transaction *odb_transaction_files_begin(struct odb_source *source)
@@ -2017,8 +2010,6 @@ struct odb_transaction *odb_transaction_files_begin(struct odb_source *source)
 	transaction->base.source = source;
 	transaction->base.commit = odb_transaction_files_commit;
 
-	odb->transaction = &transaction->base;
-
 	return &transaction->base;
 }
 
diff --git a/odb.c b/odb.c
index 349b4218a5..1679cc0465 100644
--- a/odb.c
+++ b/odb.c
@@ -1153,7 +1153,12 @@ void odb_reprepare(struct object_database *o)
 
 struct odb_transaction *odb_transaction_begin(struct object_database *odb)
 {
-	return odb_transaction_files_begin(odb->sources);
+	if (odb->transaction)
+		return NULL;
+
+	odb->transaction = odb_transaction_files_begin(odb->sources);
+
+	return odb->transaction;
 }
 
 void odb_transaction_commit(struct odb_transaction *transaction)
@@ -1161,5 +1166,12 @@ void odb_transaction_commit(struct odb_transaction *transaction)
 	if (!transaction)
 		return;
 
+	/*
+	 * Ensure the transaction ending matches the pending transaction.
+	 */
+	ASSERT(transaction == transaction->source->odb->transaction);
+
 	transaction->commit(transaction);
+	transaction->source->odb->transaction = NULL;
+	free(transaction);
 }
-- 
2.52.0.373.g68cb7f9e92
Previous: Karthik NayakNext: Karthik Nayak
Message 27 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.