aboutsummaryrefslogtreecommitdiff
path: root/odb.c
diff options
context:
space:
mode:
authorJustin Tobler <jltobler@gmail.com>2026-02-02 18:10:02 -0600
committerJunio C Hamano <gitster@pobox.com>2026-02-02 17:14:03 -0800
commit3f67e3d0211dd06d27ee3ee5b23e5f328ff2db12 (patch)
tree4f16e9ce1f6f06069a1679da78292c3ee77ed39a /odb.c
parentfa7d067923a342c298b7723935c60217a5244e4e (diff)
downloadgit-3f67e3d0211dd06d27ee3ee5b23e5f328ff2db12.tar.xz
odb: transparently handle common transaction behavior
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> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'odb.c')
-rw-r--r--odb.c14
1 files changed, 13 insertions, 1 deletions
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);
}