]> git.ipfire.org Git - thirdparty/git.git/commitdiff
odb: transparently handle common transaction behavior
authorJustin Tobler <jltobler@gmail.com>
Tue, 3 Feb 2026 00:10:02 +0000 (18:10 -0600)
committerJunio C Hamano <gitster@pobox.com>
Tue, 3 Feb 2026 01:14:03 +0000 (17:14 -0800)
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>
object-file.c
odb.c

index d7e153c1b9ad04202b3be90a7d8f0c0d3343bc71..1b62996ef0a96ff2967e5f50ff3f53a712e54578 100644 (file)
@@ -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 349b4218a591cfb73e75c89199d2cb2edf775cef..1679cc0465aa68a75b3bfcdd691e6b1559298bb2 100644 (file)
--- 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);
 }