mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 18:20:07 +01:00
wl 1801
Testcases for NF ndb/src/kernel/blocks/ERROR_codes.txt: Error insert for testing NF handling of committed read ndb/src/kernel/blocks/dblqh/DblqhMain.cpp: Error insert for testing NF handling of committed read ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: Error insert for testing NF handling of committed read ndb/test/include/NDBT_Test.hpp: Move sync methods into NDBT_Context ndb/test/ndbapi/testIndex.cpp: Move sync methods into NDBT_Context ndb/test/ndbapi/testNodeRestart.cpp: Add test case that verifies committed read during NF ndb/test/src/NDBT_Test.cpp: Move sync methods into NDBT_Context
This commit is contained in:
parent
950c682593
commit
2e201e1e7b
7 changed files with 87 additions and 37 deletions
|
@ -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*>;
|
||||
|
|
Loading…
Add table
Reference in a new issue