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<ApiConnectRecord> 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 <Bitmask.hpp>
#include <random.h>
#include <signaldata/DumpStateOrd.hpp>
+#include <NdbConfig.hpp>
/**
* 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).
| Thread |
|---|
| • bzr push into mysql-5.5-cluster-7.2 branch (jan.wedvik:3948 to 3949) | Jan Wedvik | 25 Jun |