diff options
Diffstat (limited to 'ndb/test/ndbapi/testTimeout.cpp')
-rw-r--r-- | ndb/test/ndbapi/testTimeout.cpp | 235 |
1 files changed, 193 insertions, 42 deletions
diff --git a/ndb/test/ndbapi/testTimeout.cpp b/ndb/test/ndbapi/testTimeout.cpp index 8a7866880b3..62e69125073 100644 --- a/ndb/test/ndbapi/testTimeout.cpp +++ b/ndb/test/ndbapi/testTimeout.cpp @@ -20,6 +20,44 @@ #include <UtilTransactions.hpp> #include <random.h> #include <NdbConfig.hpp> +#include <signaldata/DumpStateOrd.hpp> + +#define TIMEOUT 3000 + +Uint32 g_org_timeout = 3000; + +int +setTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){ + NdbRestarter restarter; + + NdbConfig conf(GETNDB(step)->getNodeId()+1); + unsigned int nodeId = conf.getMasterNodeId(); + if (!conf.getProperty(nodeId, + NODE_TYPE_DB, + CFG_DB_TRANSACTION_INACTIVE_TIMEOUT, + &g_org_timeout)){ + return NDBT_FAILED; + } + + int val[] = { DumpStateOrd::TcSetApplTransactionTimeout, TIMEOUT }; + if(restarter.dumpStateAllNodes(val, 2) != 0){ + return NDBT_FAILED; + } + + return NDBT_OK; +} + +int +resetTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){ + NdbRestarter restarter; + + int val[] = { DumpStateOrd::TcSetApplTransactionTimeout, g_org_timeout }; + if(restarter.dumpStateAllNodes(val, 2) != 0){ + return NDBT_FAILED; + } + + return NDBT_OK; +} int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){ @@ -55,16 +93,10 @@ int runTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ NdbConfig conf(GETNDB(step)->getNodeId()+1); unsigned int nodeId = conf.getMasterNodeId(); int stepNo = step->getStepNo(); - Uint32 timeoutVal; - if (!conf.getProperty(nodeId, - NODE_TYPE_DB, - CFG_DB_TRANSACTION_INACTIVE_TIMEOUT, - &timeoutVal)){ - return NDBT_FAILED; - } - int minSleep = (int)(timeoutVal * 1.5); - int maxSleep = timeoutVal * 2; - ndbout << "TransactionInactiveTimeout="<<timeoutVal + + int minSleep = (int)(TIMEOUT * 1.5); + int maxSleep = TIMEOUT * 2; + ndbout << "TransactionInactiveTimeout="<< TIMEOUT << ", minSleep="<<minSleep << ", maxSleep="<<maxSleep<<endl; @@ -89,7 +121,125 @@ int runTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ } while(false); hugoOps.closeTransaction(pNdb); + } + + return result; +} + +int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){ + int result = NDBT_OK; + int loops = ctx->getNumLoops(); + int stepNo = step->getStepNo(); + int mul1 = ctx->getProperty("Op1", (Uint32)0); + int mul2 = ctx->getProperty("Op2", (Uint32)0); + int records = ctx->getNumRecords(); + + int minSleep = (int)(TIMEOUT * 1.5); + int maxSleep = TIMEOUT * 2; + HugoOperations hugoOps(*ctx->getTab()); + Ndb* pNdb = GETNDB(step); + + for (int l = 0; l<loops && !ctx->isTestStopped() && result == NDBT_OK; l++){ + + int op1 = 0 + (l + stepNo) * mul1; + int op2 = 0 + (l + stepNo) * mul2; + + op1 = (op1 % 5); + op2 = (op2 % 5); + + ndbout << stepNo << ": TransactionInactiveTimeout="<< TIMEOUT + << ", minSleep="<<minSleep + << ", maxSleep="<<maxSleep + << ", op1=" << op1 + << ", op2=" << op2 << endl;; + + do{ + // Commit transaction + CHECK(hugoOps.startTransaction(pNdb) == 0); + + switch(op1){ + case 0: + break; + case 1: + if(hugoOps.pkReadRecord(pNdb, stepNo, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + case 2: + if(hugoOps.pkUpdateRecord(pNdb, stepNo, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + case 3: + if(hugoOps.pkDeleteRecord(pNdb, stepNo, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + case 4: + if(hugoOps.pkInsertRecord(pNdb, stepNo+records+l, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + } + + if(result != NDBT_OK) + break; + + int res = hugoOps.execute_NoCommit(pNdb); + if(res != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + + int sleep = minSleep + myRandom48(maxSleep-minSleep); + ndbout << stepNo << ": Sleeping for "<< sleep << " milliseconds" << endl; + NdbSleep_MilliSleep(sleep); + + switch(op2){ + case 0: + break; + case 1: + if(hugoOps.pkReadRecord(pNdb, stepNo, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + case 2: + if(hugoOps.pkUpdateRecord(pNdb, stepNo, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + case 3: + if(hugoOps.pkDeleteRecord(pNdb, stepNo, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + case 4: + if(hugoOps.pkInsertRecord(pNdb, stepNo+2*records+l, true) != 0){ + g_err << stepNo << ": Fail" << __LINE__ << endl; + result = NDBT_FAILED; break; + } + break; + } + + // Expect that transaction has timed-out + res = hugoOps.execute_Commit(pNdb); + if(op1 != 0 && res != 266){ + g_err << stepNo << ": Fail: " << res << "!= 237, op1=" + << op1 << ", op2=" << op2 << endl; + result = NDBT_FAILED; break; + } + + } while(false); + + hugoOps.closeTransaction(pNdb); } return result; @@ -98,18 +248,10 @@ int runTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ int result = NDBT_OK; int loops = ctx->getNumLoops(); - NdbConfig conf(GETNDB(step)->getNodeId()+1); - unsigned int nodeId = conf.getMasterNodeId(); int stepNo = step->getStepNo(); - Uint32 timeoutVal; - if (!conf.getProperty(nodeId, - NODE_TYPE_DB, - CFG_DB_TRANSACTION_INACTIVE_TIMEOUT, - &timeoutVal)){ - return NDBT_FAILED; - } - int maxSleep = (int)(timeoutVal * 0.5); - ndbout << "TransactionInactiveTimeout="<<timeoutVal + + int maxSleep = (int)(TIMEOUT * 0.5); + ndbout << "TransactionInactiveTimeout="<< TIMEOUT << ", maxSleep="<<maxSleep<<endl; @@ -134,11 +276,8 @@ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ } while(false); hugoOps.closeTransaction(pNdb); - - } - return result; } @@ -146,18 +285,9 @@ int runBuddyTransNoTimeout(NDBT_Context* ctx, NDBT_Step* step){ int result = NDBT_OK; int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); - NdbConfig conf(GETNDB(step)->getNodeId()+1); - unsigned int nodeId = conf.getMasterNodeId(); int stepNo = step->getStepNo(); - Uint32 timeoutVal; - if (!conf.getProperty(nodeId, - NODE_TYPE_DB, - CFG_DB_TRANSACTION_INACTIVE_TIMEOUT, - &timeoutVal)){ - return NDBT_FAILED; - } - int maxSleep = (int)(timeoutVal * 0.3); - ndbout << "TransactionInactiveTimeout="<<timeoutVal + int maxSleep = (int)(TIMEOUT * 0.3); + ndbout << "TransactionInactiveTimeout="<< TIMEOUT << ", maxSleep="<<maxSleep<<endl; HugoOperations hugoOps(*ctx->getTab()); @@ -172,11 +302,11 @@ int runBuddyTransNoTimeout(NDBT_Context* ctx, NDBT_Step* step){ CHECK(hugoOps.pkInsertRecord(pNdb, recordNo, true) == 0); CHECK(hugoOps.execute_NoCommit(pNdb) == 0); - for (int i = 0; i < 10; i++){ + for (int i = 0; i < 3; i++){ // Perform buddy scan reads - CHECK(hugoOps.scanReadRecords(pNdb) == 0); - CHECK(hugoOps.executeScanRead(pNdb) == 0); - + CHECK((hugoOps.scanReadRecords(pNdb)) == 0); + CHECK(hugoOps.execute_NoCommit(pNdb) == 0); + int sleep = myRandom48(maxSleep); ndbout << "Sleeping for " << sleep << " milliseconds" << endl; NdbSleep_MilliSleep(sleep); @@ -188,10 +318,7 @@ int runBuddyTransNoTimeout(NDBT_Context* ctx, NDBT_Step* step){ } while(false); hugoOps.closeTransaction(pNdb); - - } - return result; } @@ -202,7 +329,9 @@ TESTCASE("DontTimeoutTransaction", "if we sleep during the transaction. Use a sleep "\ "value which is smaller than TransactionInactiveTimeout"){ INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); STEPS(runDontTimeoutTrans, 1); + FINALIZER(resetTransactionTimeout); FINALIZER(runClearTable); } TESTCASE("DontTimeoutTransaction5", @@ -211,7 +340,9 @@ TESTCASE("DontTimeoutTransaction5", "value which is smaller than TransactionInactiveTimeout" \ "Five simultaneous threads"){ INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); STEPS(runDontTimeoutTrans, 5); + FINALIZER(resetTransactionTimeout); FINALIZER(runClearTable); } TESTCASE("TimeoutTransaction", @@ -219,7 +350,9 @@ TESTCASE("TimeoutTransaction", "if we sleep during the transaction. Use a sleep "\ "value which is larger than TransactionInactiveTimeout"){ INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); STEPS(runTimeoutTrans, 1); + FINALIZER(resetTransactionTimeout); FINALIZER(runClearTable); } TESTCASE("TimeoutTransaction5", @@ -228,7 +361,21 @@ TESTCASE("TimeoutTransaction5", "value which is larger than TransactionInactiveTimeout" \ "Five simultaneous threads"){ INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); STEPS(runTimeoutTrans, 5); + FINALIZER(resetTransactionTimeout); + FINALIZER(runClearTable); +} +TESTCASE("TimeoutRandTransaction", + "Test that the transaction does timeout "\ + "if we sleep during the transaction. Use a sleep "\ + "value which is larger than TransactionInactiveTimeout"){ + INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); + TC_PROPERTY("Op1", 7); + TC_PROPERTY("Op2", 11); + STEPS(runTimeoutTrans2, 5); + FINALIZER(resetTransactionTimeout); FINALIZER(runClearTable); } TESTCASE("BuddyTransNoTimeout", @@ -238,7 +385,9 @@ TESTCASE("BuddyTransNoTimeout", "The total sleep time is longer than TransactionInactiveTimeout" \ "Commit the first transaction, it should not have timed out."){ INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); STEPS(runBuddyTransNoTimeout, 1); + FINALIZER(resetTransactionTimeout); FINALIZER(runClearTable); } TESTCASE("BuddyTransNoTimeout5", @@ -249,7 +398,9 @@ TESTCASE("BuddyTransNoTimeout5", "Commit the first transaction, it should not have timed out." \ "Five simultaneous threads"){ INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); STEPS(runBuddyTransNoTimeout, 5); + FINALIZER(resetTransactionTimeout); FINALIZER(runClearTable); } NDBT_TESTSUITE_END(testTimeout); |