From: Jan Wedvik Date: June 25 2012 11:36am Subject: bzr push into mysql-5.5-cluster-7.2 branch (jan.wedvik:3948 to 3949) List-Archive: http://lists.mysql.com/commits/144307 Message-Id: <20120625113632.27012.76792.3949@atum17.no.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3949 Jan Wedvik 2012-06-25 [merge] Merge 7.1 -> 7.2 modified: storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp storage/ndb/test/ndbapi/testBasic.cpp storage/ndb/test/run-test/daily-basic-tests.txt 3948 Bernd Ocklin 2012-06-25 add missing ndb_blob_tool to rpm spec modified: support-files/mysql.spec.sh === modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp' --- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2012-06-21 15:24:52 +0000 +++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2012-06-25 11:35:54 +0000 @@ -5025,6 +5025,7 @@ void Dbtc::seizeApiConnectCopy(Signal* s ptrCheckGuard(locApiConnectptr, TapiConnectFilesize, localApiConnectRecord); cfirstfreeApiConnectCopy = locApiConnectptr.p->nextApiConnect; locApiConnectptr.p->nextApiConnect = RNIL; + ndbassert(regApiPtr->apiCopyRecord == RNIL); regApiPtr->apiCopyRecord = locApiConnectptr.i; tc_clearbit(regApiPtr->m_flags, ApiConnectRecord::TF_TRIGGER_PENDING); @@ -5067,7 +5068,9 @@ void Dbtc::execDIVERIFYCONF(Signal* sign * WE WILL INSERT THE TRANSACTION INTO ITS PROPER QUEUE OF * TRANSACTIONS FOR ITS GLOBAL CHECKPOINT. *-------------------------------------------------------------------------*/ - if (TApifailureNr != Tfailure_nr) { + if (TApifailureNr != Tfailure_nr || + ERROR_INSERTED(8094)) { + jam(); DIVER_node_fail_handling(signal, Tgci); return; }//if @@ -5563,7 +5566,12 @@ Dbtc::sendApiCommit(Signal* signal) err8055: Ptr copyPtr; UintR TapiConnectFilesize = capiConnectFilesize; + /** + * Unlink copy connect record from main connect record to allow main record + * re-use. + */ copyPtr.i = regApiPtr.p->apiCopyRecord; + regApiPtr.p->apiCopyRecord = RNIL; UintR TapiFailState = regApiPtr.p->apiFailState; ApiConnectRecord *localApiConnectRecord = apiConnectRecord; @@ -6209,6 +6217,7 @@ void Dbtc::handleGcp(Signal* signal, Ptr void Dbtc::releaseApiConCopy(Signal* signal) { ApiConnectRecord * const regApiPtr = apiConnectptr.p; + ndbassert(regApiPtr->nextApiConnect == RNIL); UintR TfirstfreeApiConnectCopyOld = cfirstfreeApiConnectCopy; cfirstfreeApiConnectCopy = apiConnectptr.i; regApiPtr->nextApiConnect = TfirstfreeApiConnectCopyOld; @@ -12256,6 +12265,7 @@ void Dbtc::initApiConnect(Signal* signal apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); apiConnectptr.p->singleUserMode = 0; + apiConnectptr.p->apiCopyRecord = RNIL; }//for apiConnectptr.i = tiacTmp - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -12285,6 +12295,7 @@ void Dbtc::initApiConnect(Signal* signal apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); apiConnectptr.p->singleUserMode = 0; + apiConnectptr.p->apiCopyRecord = RNIL; }//for apiConnectptr.i = (2 * tiacTmp) - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -12314,6 +12325,7 @@ void Dbtc::initApiConnect(Signal* signal apiConnectptr.p->currSavePointId = 0; apiConnectptr.p->m_transaction_nodes.clear(); apiConnectptr.p->singleUserMode = 0; + apiConnectptr.p->apiCopyRecord = RNIL; }//for apiConnectptr.i = (3 * tiacTmp) - 1; ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord); @@ -12574,6 +12586,19 @@ void Dbtc::releaseAbortResources(Signal* TcConnectRecordPtr rarTcConnectptr; c_counters.cabortCount++; + if (apiConnectptr.p->apiCopyRecord != RNIL) + { + // Put apiCopyRecord back in free list. + jam(); + ApiConnectRecordPtr copyPtr; + copyPtr.i = apiConnectptr.p->apiCopyRecord; + ptrCheckGuard(copyPtr, capiConnectFilesize, apiConnectRecord); + ndbassert(copyPtr.p->apiCopyRecord == RNIL); + ndbassert(copyPtr.p->nextApiConnect == RNIL); + copyPtr.p->nextApiConnect = cfirstfreeApiConnectCopy; + cfirstfreeApiConnectCopy = copyPtr.i; + apiConnectptr.p->apiCopyRecord = RNIL; + } if (apiConnectptr.p->cachePtr != RNIL) { cachePtr.i = apiConnectptr.p->cachePtr; ptrCheckGuard(cachePtr, ccacheFilesize, cacheRecord); @@ -12676,6 +12701,8 @@ void Dbtc::releaseApiCon(Signal* signal, TlocalApiConnectptr.i = TapiConnectPtr; ptrCheckGuard(TlocalApiConnectptr, capiConnectFilesize, apiConnectRecord); + ndbassert(TlocalApiConnectptr.p->apiCopyRecord == RNIL); + ndbassert(TlocalApiConnectptr.p->nextApiConnect == RNIL); TlocalApiConnectptr.p->nextApiConnect = cfirstfreeApiConnect; cfirstfreeApiConnect = TlocalApiConnectptr.i; setApiConTimer(TlocalApiConnectptr.i, 0, __LINE__); === modified file 'storage/ndb/test/ndbapi/testBasic.cpp' --- a/storage/ndb/test/ndbapi/testBasic.cpp 2011-06-20 07:17:57 +0000 +++ b/storage/ndb/test/ndbapi/testBasic.cpp 2012-06-25 11:18:06 +0000 @@ -24,6 +24,7 @@ #include #include #include +#include /** * TODO @@ -3002,6 +3003,63 @@ int runRefreshTuple(NDBT_Context* ctx, N return rc; }; +// An 'assert' that is always executed, so that 'cond' may have side effects. +#ifdef NDEBUG +#define ASSERT_ALWAYS(cond) if(!(cond)){abort();} +#else +#define ASSERT_ALWAYS assert +#endif + +// Regression test for bug #14208924 +static int +runLeakApiConnectObjects(NDBT_Context* ctx, NDBT_Step* step) +{ + NdbRestarter restarter; + /** + * This error insert inc ombination with bug #14208924 will + * cause TC to leak ApiConnectRecord objects. + */ + restarter.insertErrorInAllNodes(8094); + + Ndb* const ndb = GETNDB(step); + Uint32 maxTrans = 0; + NdbConfig conf(GETNDB(step)->getNodeId()+1); + ASSERT_ALWAYS(conf.getProperty(conf.getMasterNodeId(), + NODE_TYPE_DB, + CFG_DB_NO_TRANSACTIONS, + &maxTrans)); + ASSERT_ALWAYS(maxTrans > 0); + + HugoOperations hugoOps(*ctx->getTab()); + // One ApiConnectRecord object is leaked for each iteration. + for (uint i = 0; i < maxTrans+1; i++) + { + ASSERT_ALWAYS(hugoOps.startTransaction(ndb) == 0); + ASSERT_ALWAYS(hugoOps.pkInsertRecord(ndb, i) == 0); + NdbTransaction* const trans = hugoOps.getTransaction(); + /** + * The error insert causes trans->execute(Commit) to fail with error code + * 286 even if the bug is fixed. Therefore, we ignore this error code. + */ + if (trans->execute(Commit) != 0 && + trans->getNdbError().code != 286) + { + g_err << "trans->execute() gave unexpected error : " + << trans->getNdbError() << endl; + restarter.insertErrorInAllNodes(0); + return NDBT_FAILED; + } + ASSERT_ALWAYS(hugoOps.closeTransaction(ndb) == 0); + } + restarter.insertErrorInAllNodes(0); + + UtilTransactions utilTrans(*ctx->getTab()); + if (utilTrans.clearTable(ndb) != 0){ + return NDBT_FAILED; + } + return NDBT_OK; +} + enum PreRefreshOps { PR_NONE, @@ -3584,6 +3642,10 @@ TESTCASE("899", "") STEP(runTest899); FINALIZER(runEnd899); } +TESTCASE("LeakApiConnectObjects", "") +{ + INITIALIZER(runLeakApiConnectObjects); +} TESTCASE("RefreshLocking", "Test Refresh locking properties") { === modified file 'storage/ndb/test/run-test/daily-basic-tests.txt' --- a/storage/ndb/test/run-test/daily-basic-tests.txt 2012-04-24 14:41:37 +0000 +++ b/storage/ndb/test/run-test/daily-basic-tests.txt 2012-06-25 11:35:54 +0000 @@ -1867,3 +1867,7 @@ max-time: 300 cmd: testDict args: -n IndexStatCreate T1 +max-time: 300 +cmd: testBasic +args: -n LeakApiConnectObjects T1 + No bundle (reason: useless for push emails).