List:Commits« Previous MessageNext Message »
From:Olav Sandstaa Date:October 24 2008 12:20pm
Subject:bzr commit into mysql-6.0-falcon-team branch (olav:2880) Bug#38739
View as plain text  
#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#38739Olav Sandstaa24 Oct