4947 Jan Wedvik 2012-06-25 [merge]
Merge 6.3 -> 7.0.
modified:
storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
storage/ndb/test/ndbapi/testBasic.cpp
storage/ndb/test/run-test/daily-basic-tests.txt
4946 Mauritz Sundell 2012-06-21 [merge]
ndb - increase of hashmap size and supporting 1024 partitions
This increased the hashmap size from 240 to 3840 to ensure that we don't get unbalanced
access to the partitions in a large cluster setup. Influenced performance at 16 nodes and
beyond by a fairly significant factor.
Part of Mikael Ronstroms "Patches used in benchmark tree with Intel"
modified:
storage/ndb/include/kernel/ndb_limits.h
storage/ndb/include/kernel/signaldata/CreateTable.hpp
storage/ndb/include/kernel/signaldata/DictTabInfo.hpp
storage/ndb/include/kernel/signaldata/ScanTab.hpp
storage/ndb/include/ndb_version.h.in
storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp
storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp
storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
storage/ndb/src/kernel/blocks/ndbfs/AsyncIoThread.hpp
storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp
storage/ndb/src/kernel/blocks/suma/Suma.hpp
storage/ndb/src/kernel/vm/SimulatedBlock.hpp
storage/ndb/src/ndbapi/NdbDictionary.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
storage/ndb/src/ndbapi/NdbQueryOperation.cpp
storage/ndb/src/ndbapi/NdbScanOperation.cpp
=== modified file 'storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2012-06-21 12:33:15 +0000
+++ b/storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2012-06-25 11:18:06 +0000
@@ -5006,6 +5006,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);
@@ -5048,7 +5049,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
@@ -5544,7 +5547,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;
@@ -6189,6 +6197,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;
@@ -12226,6 +12235,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);
@@ -12255,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 = (2 * tiacTmp) - 1;
ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord);
@@ -12284,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 = (3 * tiacTmp) - 1;
ptrCheckGuard(apiConnectptr, capiConnectFilesize, apiConnectRecord);
@@ -12544,6 +12556,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);
@@ -12646,6 +12671,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 13:17:43 +0000
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt 2012-06-25 11:18:06 +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.1-telco-7.0 branch (jan.wedvik:4946 to 4947) | Jan Wedvik | 25 Jun |