#At file:///home/os136802/mysql/develop/repo/falcon-trans2/
2880 Olav Sandstaa 2008-10-24
Fix for Bug #38739 Assert in Transaction::initialize during simple
SELECT queries
Fixes an A-B-A problem in TransactionManager::startTransaction() where
it was possible that the transaction object could be reused by another
thread between the test for being available for reuse and actually
being allocated.
modified:
storage/falcon/TransactionManager.cpp
=== modified file 'storage/falcon/TransactionManager.cpp'
=== modified file 'storage/falcon/TransactionManager.cpp'
--- a/storage/falcon/TransactionManager.cpp 2008-10-16 02:53:35 +0000
+++ b/storage/falcon/TransactionManager.cpp 2008-10-24 10:20:10 +0000
@@ -118,9 +118,23 @@
if (transaction->state == Available && transaction->dependencies == 0)
if (COMPARE_EXCHANGE(&transaction->state, Available, Initializing))
{
- transaction->initialize(connection, INTERLOCKED_INCREMENT(transactionSequence));
-
- return transaction;
+ // Check again that the dependencies are zero. The transaction
+ // object might have been re-use between the previous if-test
+ // and the actual change of state
+
+ if (transaction->dependencies != 0)
+ {
+ // Return the transaction object back to the list
+
+ transaction->state = Available;
+ }
+ else
+ {
+ ASSERT(transaction->dependencies == 0);
+ transaction->initialize(connection, INTERLOCKED_INCREMENT(transactionSequence));
+
+ return transaction;
+ }
}
sync.unlock();
| Thread |
|---|
| • bzr commit into mysql-6.0-falcon-team branch (olav:2880) Bug#38739 | Olav Sandstaa | 24 Oct |