From: Date: September 10 2008 8:43am Subject: bzr commit into mysql-6.0-falcon branch (cpowers:2817) Bug#39350 List-Archive: http://lists.mysql.com/commits/53659 X-Bug: 39350 Message-Id: <20080910064302.A2EE71DB0726@xeno.mysql.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At file:///home/cpowers/work/dev/dev-07/mysql/ 2817 Christopher Powers 2008-09-10 Bug #39350 Falcon: Releasing deferred indexes causes crash Removed new DeferredIndex reference counts in Transaction and DeferredIndexWalker. modified: storage/falcon/DeferredIndex.cpp storage/falcon/DeferredIndexWalker.cpp storage/falcon/Transaction.cpp per-file messages: storage/falcon/DeferredIndex.cpp Restored releaseRef() in DeferredIndex::detachTransaction() storage/falcon/DeferredIndexWalker.cpp Removed addRef() in DeferredIndexWalker::initialize() Removed releaseRef() in DeferredIndexWalker::~DeferredIndexWalker() storage/falcon/Transaction.cpp Removed DeferredIndex::addRef and ::release. Reference counts were somehow unbalanced, preventing DeferredIndex objects from being freed. === modified file 'storage/falcon/DeferredIndex.cpp' --- a/storage/falcon/DeferredIndex.cpp 2008-09-10 04:02:07 +0000 +++ b/storage/falcon/DeferredIndex.cpp 2008-09-10 06:42:49 +0000 @@ -840,7 +840,7 @@ void DeferredIndex::detachTransaction(vo else sync.unlock(); - //releaseRef(); + releaseRef(); } void DeferredIndex::chill(Dbb *dbb) === modified file 'storage/falcon/DeferredIndexWalker.cpp' --- a/storage/falcon/DeferredIndexWalker.cpp 2008-09-10 04:02:07 +0000 +++ b/storage/falcon/DeferredIndexWalker.cpp 2008-09-10 06:42:49 +0000 @@ -31,7 +31,6 @@ DeferredIndexWalker::DeferredIndexWalker void DeferredIndexWalker::initialize(DeferredIndex *deferredIdx, IndexKey *indexKey, int searchFlags) { deferredIndex = deferredIdx; - deferredIndex->addRef(); currentNode = NULL; DIBucket *bucket = (DIBucket*) deferredIndex->root; nodePending = true; @@ -95,8 +94,6 @@ void DeferredIndexWalker::initialize(Def DeferredIndexWalker::~DeferredIndexWalker(void) { - if (deferredIndex) - deferredIndex->releaseRef(); } DINode* DeferredIndexWalker::next(void) === modified file 'storage/falcon/Transaction.cpp' --- a/storage/falcon/Transaction.cpp 2008-09-10 04:37:47 +0000 +++ b/storage/falcon/Transaction.cpp 2008-09-10 06:42:49 +0000 @@ -1317,7 +1317,6 @@ void Transaction::add(DeferredIndex* def Sync sync(&syncDeferredIndexes, "Transaction::add"); sync.lock(Exclusive); - deferredIndex->addRef(); deferredIndex->nextInTransaction = deferredIndexes; deferredIndexes = deferredIndex; deferredIndexCount++; @@ -1503,7 +1502,6 @@ void Transaction::releaseDeferredIndexes { ASSERT(deferredIndex->transaction == this); deferredIndexes = deferredIndex->nextInTransaction; - deferredIndex->releaseRef(); deferredIndexCount--; } } @@ -1519,7 +1517,6 @@ void Transaction::releaseDeferredIndexes { *ptr = deferredIndex->nextInTransaction; deferredIndex->detachTransaction(); - deferredIndex->releaseRef(); --deferredIndexCount; } else