Commit 20e5bfe8 authored by joreland@mysql.com's avatar joreland@mysql.com

wl 1801

 Testcases for NF
parent 46b2eae0
......@@ -3,7 +3,7 @@ Next NDBCNTR 1000
Next NDBFS 2000
Next DBACC 3001
Next DBTUP 4007
Next DBLQH 5040
Next DBLQH 5042
Next DBDICT 6006
Next DBDIH 7174
Next DBTC 8035
......@@ -193,6 +193,8 @@ Delay execution of ABORTREQ signal 2 seconds to generate time-out.
5038: Drop LQHKEYREQ + set 5039
5039: Drop ABORT + set 5003
8048: Make TC not choose own node for simple/dirty read
5041: Crash is receiving simple read from other TC on different node
ERROR CODES FOR TESTING TIME-OUT HANDLING IN DBTC
-------------------------------------------------
......
......@@ -3305,6 +3305,9 @@ void Dblqh::execLQHKEYREQ(Signal* signal)
UintR TreclenAiLqhkey = LqhKeyReq::getAIInLqhKeyReq(Treqinfo);
regTcPtr->apiVersionNo = 0;
CRASH_INSERTION2(5041, regTcPtr->simpleRead &&
refToNode(signal->senderBlockRef()) != cownNodeid);
regTcPtr->reclenAiLqhkey = TreclenAiLqhkey;
regTcPtr->currReclenAi = TreclenAiLqhkey;
UintR TitcKeyLen = LqhKeyReq::getKeyLen(Treqinfo);
......
......@@ -2963,15 +2963,27 @@ void Dbtc::tckeyreq050Lab(Signal* signal)
/*-------------------------------------------------------------*/
arrGuard(tnoOfBackup, 4);
UintR Tindex;
UintR TownNode = cownNodeid;
for (Tindex = 1; Tindex <= tnoOfBackup; Tindex++) {
UintR Tnode = regTcPtr->tcNodedata[Tindex];
UintR TownNode = cownNodeid;
jam();
if (Tnode == TownNode) {
jam();
regTcPtr->tcNodedata[0] = Tnode;
}//if
}//for
if(ERROR_INSERTED(8048))
{
for (Tindex = 0; Tindex <= tnoOfBackup; Tindex++)
{
UintR Tnode = regTcPtr->tcNodedata[Tindex];
jam();
if (Tnode != TownNode) {
jam();
regTcPtr->tcNodedata[0] = Tnode;
}//if
}//for
}
}//if
jam();
regTcPtr->lastReplicaNo = 0;
......
......@@ -82,6 +82,12 @@ public:
*/
int getNoOfRunningSteps() const ;
int getNoOfCompletedSteps() const ;
/**
* Thread sync
*/
void sync_down(const char * key);
void sync_up_and_wait(const char * key, Uint32 count = 0);
private:
friend class NDBT_Step;
friend class NDBT_TestSuite;
......
......@@ -380,27 +380,6 @@ runVerifyIndex(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_OK;
}
int
sync_down(NDBT_Context* ctx){
Uint32 threads = ctx->getProperty("PauseThreads", (unsigned)0);
if(threads){
ctx->decProperty("PauseThreads");
}
return 0;
}
int
sync_up_and_wait(NDBT_Context* ctx){
Uint32 threads = ctx->getProperty("Threads", (unsigned)0);
ndbout_c("Setting PauseThreads to %d", threads);
ctx->setProperty("PauseThreads", threads);
ctx->getPropertyWait("PauseThreads", (unsigned)0);
if(threads){
ndbout_c("wait completed");
}
return 0;
}
int
runTransactions1(NDBT_Context* ctx, NDBT_Step* step){
// Verify that data in index match
......@@ -416,7 +395,7 @@ runTransactions1(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
......@@ -425,7 +404,7 @@ runTransactions1(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
}
return NDBT_OK;
}
......@@ -446,7 +425,7 @@ runTransactions2(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
#endif
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
#if 1
......@@ -455,7 +434,7 @@ runTransactions2(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
#endif
sync_down(ctx);
ctx->sync_down("PauseThreads");
}
return NDBT_OK;
}
......@@ -476,7 +455,7 @@ runTransactions3(NDBT_Context* ctx, NDBT_Step* step){
g_err << "Load table failed" << endl;
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
......@@ -485,7 +464,7 @@ runTransactions3(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
......@@ -494,7 +473,7 @@ runTransactions3(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
......@@ -503,7 +482,7 @@ runTransactions3(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
......@@ -512,7 +491,7 @@ runTransactions3(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
......@@ -521,14 +500,14 @@ runTransactions3(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED;
}
sync_down(ctx);
ctx->sync_down("PauseThreads");
if(ctx->isTestStopped())
break;
int count = -1;
if(utilTrans.selectCount(pNdb, 64, &count) != 0 || count != 0)
return NDBT_FAILED;
sync_down(ctx);
ctx->sync_down("PauseThreads");
}
return NDBT_OK;
}
......@@ -540,6 +519,7 @@ int runRestarts(NDBT_Context* ctx, NDBT_Step* step){
NdbRestarts restarts;
int i = 0;
int timeout = 240;
int sync_threads = ctx->getProperty("Threads", (unsigned)0);
while(i<loops && result != NDBT_FAILED && !ctx->isTestStopped()){
if(restarts.executeRestart("RestartRandomNodeAbort", timeout) != 0){
......@@ -547,7 +527,7 @@ int runRestarts(NDBT_Context* ctx, NDBT_Step* step){
result = NDBT_FAILED;
break;
}
sync_up_and_wait(ctx);
ctx->sync_up_and_wait("PauseThreads", sync_threads);
i++;
}
ctx->stopTest();
......
......@@ -219,6 +219,7 @@ int runScanReadVerify(NDBT_Context* ctx, NDBT_Step* step){
int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
int result = NDBT_OK;
int loops = ctx->getNumLoops();
int sync_threads = ctx->getProperty("SyncThreads", (unsigned)0);
NdbRestarter restarter;
int i = 0;
int lastId = 0;
......@@ -235,7 +236,7 @@ int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
loops *= restarter.getNumDbNodes();
while(i<loops && result != NDBT_FAILED && !ctx->isTestStopped()){
int id = lastId % restarter.getNumDbNodes();
int nodeId = restarter.getDbNodeId(id);
ndbout << "Restart node " << nodeId << endl;
......@@ -251,7 +252,7 @@ int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
break;
}
NdbSleep_SecSleep(1);
ctx->sync_up_and_wait("PauseThreads", sync_threads);
lastId++;
i++;
......@@ -295,6 +296,32 @@ int runRestarts(NDBT_Context* ctx, NDBT_Step* step){
return result;
}
int runDirtyRead(NDBT_Context* ctx, NDBT_Step* step){
int result = NDBT_OK;
int loops = ctx->getNumLoops();
NdbRestarter restarter;
HugoTransactions hugoTrans(*ctx->getTab());
int i = 0;
while(i<loops && result != NDBT_FAILED && !ctx->isTestStopped()){
g_info << i << ": ";
int id = i % restarter.getNumDbNodes();
int nodeId = restarter.getDbNodeId(id);
ndbout << "Restart node " << nodeId << endl;
restarter.insertErrorInNode(nodeId, 5041);
restarter.insertErrorInAllNodes(8048);
if (hugoTrans.pkReadRecords(GETNDB(step), 1, 1,
NdbOperation::LM_CommittedRead) != 0)
{
return NDBT_FAILED;
}
i++;
}
return result;
}
NDBT_TESTSUITE(testNodeRestart);
TESTCASE("NoLoad",
"Test that one node at a time can be stopped and then restarted "\
......@@ -545,6 +572,12 @@ TESTCASE("StopOnError",
FINALIZER(runScanReadVerify);
FINALIZER(runClearTable);
}
TESTCASE("CommittedRead",
"Test committed read"){
INITIALIZER(runLoadTable);
STEP(runDirtyRead);
FINALIZER(runClearTable);
}
NDBT_TESTSUITE_END(testNodeRestart);
int main(int argc, const char** argv){
......
......@@ -1150,6 +1150,20 @@ void NDBT_Step::print(){
}
void
NDBT_Context::sync_down(const char * key){
Uint32 threads = getProperty(key, (unsigned)0);
if(threads){
decProperty(key);
}
}
void
NDBT_Context::sync_up_and_wait(const char * key, Uint32 value){
setProperty(key, value);
getPropertyWait(key, (unsigned)0);
}
template class Vector<NDBT_TestCase*>;
template class Vector<NDBT_TestCaseResult*>;
template class Vector<NDBT_Step*>;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment