From: Date: October 24 2008 12:20pm Subject: bzr commit into mysql-6.0-falcon-team branch (olav:2880) Bug#38739 List-Archive: http://lists.mysql.com/commits/56988 X-Bug: 38739 Message-Id: <20081024102018.4886.qmail@khepri11> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #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();