testtimeout.cpp

来自「MySQL源码文件5.X系列, 可自已编译到服务器」· C++ 代码 · 共 562 行 · 第 1/2 页

CPP
562
字号
    do{      // Commit transaction      CHECK(hugoOps.startTransaction(pNdb) == 0);      CHECK(hugoOps.pkReadRecord(pNdb, stepNo) == 0);      CHECK(hugoOps.execute_NoCommit(pNdb) == 0);            int sleep = myRandom48(maxSleep);         ndbout << "Sleeping for " << sleep << " milliseconds" << endl;      NdbSleep_MilliSleep(sleep);            // Expect that transaction has NOT timed-out      CHECK(hugoOps.execute_Commit(pNdb) == 0);         } while(false);    hugoOps.closeTransaction(pNdb);  }      return result;}int runDeadlockTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){  int result = NDBT_OK;  int loops = ctx->getNumLoops();  int stepNo = step->getStepNo();  Uint32 deadlock_timeout;  NdbConfig conf(GETNDB(step)->getNodeId()+1);  unsigned int nodeId = conf.getMasterNodeId();  if (!conf.getProperty(nodeId,                        NODE_TYPE_DB,                        CFG_DB_TRANSACTION_DEADLOCK_TIMEOUT,                        &deadlock_timeout)){    return NDBT_FAILED;  }  int do_sleep = (int)(deadlock_timeout * 0.5);  HugoOperations hugoOps(*ctx->getTab());  Ndb* pNdb = GETNDB(step);  for (int l = 0; l < loops && result == NDBT_OK; l++){    do{      // Commit transaction      CHECK(hugoOps.startTransaction(pNdb) == 0);      CHECK(hugoOps.pkReadRecord(pNdb, stepNo) == 0);      CHECK(hugoOps.execute_NoCommit(pNdb) == 0);      int sleep = deadlock_timeout * 1.5 + myRandom48(do_sleep);      ndbout << "Sleeping for " << sleep << " milliseconds" << endl;      NdbSleep_MilliSleep(sleep);      // Expect that transaction has NOT timed-out      CHECK(hugoOps.execute_Commit(pNdb) == 0);    } while(false);    hugoOps.closeTransaction(pNdb);  }  return result;}int runBuddyTransNoTimeout(NDBT_Context* ctx, NDBT_Step* step){  int result = NDBT_OK;  int loops = ctx->getNumLoops();  int records = ctx->getNumRecords();  int stepNo = step->getStepNo();  int maxSleep = (int)(TIMEOUT * 0.3);  ndbout << "TransactionInactiveTimeout="<< TIMEOUT	 << ", maxSleep="<<maxSleep<<endl;  HugoOperations hugoOps(*ctx->getTab());  Ndb* pNdb = GETNDB(step);  for (int l = 1; l < loops && result == NDBT_OK; l++){    do{      // Start an insert trans      CHECK(hugoOps.startTransaction(pNdb) == 0);      int recordNo = records + (stepNo*loops) + l;      CHECK(hugoOps.pkInsertRecord(pNdb, recordNo) == 0);      CHECK(hugoOps.execute_NoCommit(pNdb) == 0);            for (int i = 0; i < 3; i++){	// Perform buddy scan reads	CHECK((hugoOps.scanReadRecords(pNdb)) == 0);	CHECK(hugoOps.execute_NoCommit(pNdb) == 0); 		int sleep = myRandom48(maxSleep);   		ndbout << "Sleeping for " << sleep << " milliseconds" << endl;	NdbSleep_MilliSleep(sleep);      }      // Expect that transaction has NOT timed-out      CHECK(hugoOps.execute_Commit(pNdb) == 0);         } while(false);    hugoOps.closeTransaction(pNdb);  }  return result;}int runBuddyTransTimeout(NDBT_Context* ctx, NDBT_Step* step){  int result = NDBT_OK;  int loops = ctx->getNumLoops();  int records = ctx->getNumRecords();  int stepNo = step->getStepNo();  ndbout << "TransactionInactiveTimeout="<< TIMEOUT <<endl;  HugoOperations hugoOps(*ctx->getTab());  Ndb* pNdb = GETNDB(step);  for (int l = 1; l < loops && result == NDBT_OK; l++){    NdbTransaction* pTrans = 0;    do{      pTrans = pNdb->startTransaction();      NdbScanOperation* pOp = pTrans->getNdbScanOperation(ctx->getTab());      CHECK(pOp->readTuples(NdbOperation::LM_Read, 0, 0, 1) == 0);      CHECK(pTrans->execute(NoCommit) == 0);            int sleep = 2 * TIMEOUT;      ndbout << "Sleeping for " << sleep << " milliseconds" << endl;      NdbSleep_MilliSleep(sleep);          int res = 0;      while((res = pOp->nextResult()) == 0);      ndbout_c("res: %d", res);      CHECK(res == -1);          } while(false);        if (pTrans)    {      pTrans->close();    }  }    return result;}int runError4012(NDBT_Context* ctx, NDBT_Step* step){  int result = NDBT_OK;  int loops = ctx->getNumLoops();  int stepNo = step->getStepNo();    int timeout = ctx->getProperty("TransactionDeadlockTimeout", TIMEOUT);  HugoOperations hugoOps(*ctx->getTab());  Ndb* pNdb = GETNDB(step);  do{    // Commit transaction    CHECK(hugoOps.startTransaction(pNdb) == 0);    CHECK(hugoOps.pkUpdateRecord(pNdb, 0) == 0);    int ret = hugoOps.execute_NoCommit(pNdb);    if (ret == 0)    {      int sleep = timeout;      ndbout << "Sleeping for " << sleep << " milliseconds" << endl;      NdbSleep_MilliSleep(sleep);            // Expect that transaction has NOT timed-out      CHECK(hugoOps.execute_Commit(pNdb) == 0);    }    else    {      CHECK(ret == 4012);    }  } while(false);    hugoOps.closeTransaction(pNdb);    return result;}NDBT_TESTSUITE(testTimeout);TESTCASE("DontTimeoutTransaction", 	 "Test that the transaction does not timeout "\	 "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("Bug11290",         "Setting TransactionInactiveTimeout to 0(zero) "\         "should result in infinite timeout, and not as "\         "was the bug, a timeout that is equal to the deadlock timeout"){  TC_PROPERTY("TransactionInactiveTimeout",(Uint32)0);  INITIALIZER(runLoadTable);  INITIALIZER(setTransactionTimeout);  STEPS(runDeadlockTimeoutTrans, 1);  FINALIZER(resetTransactionTimeout);  FINALIZER(runClearTable);}TESTCASE("DontTimeoutTransaction5", 	 "Test that the transaction does not timeout "\	 "if we sleep during the transaction. Use a sleep "\	 "value which is smaller than TransactionInactiveTimeout" \	 "Five simultaneous threads"){  INITIALIZER(runLoadTable);  INITIALIZER(setTransactionTimeout);  STEPS(runDontTimeoutTrans, 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", 	 "Start a transaction and perform an insert with NoCommit. " \	 "Start a buddy transaction wich performs long running scans " \	 "and sleeps. " \	 "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", 	 "Start a transaction and perform an insert with NoCommit. " \	 "Start a buddy transaction wich performs long running scans " \	 "and sleeps. " \	 "The total sleep time is longer than TransactionInactiveTimeout" \	 "Commit the first transaction, it should not have timed out." \	 "Five simultaneous threads"){  INITIALIZER(runLoadTable);  INITIALIZER(setTransactionTimeout);  STEPS(runBuddyTransNoTimeout, 5);  FINALIZER(resetTransactionTimeout);  FINALIZER(runClearTable);}TESTCASE("BuddyTransTimeout1", 	 "Start a scan and check that it gets aborted"){  INITIALIZER(runLoadTable);  INITIALIZER(setTransactionTimeout);  STEPS(runBuddyTransTimeout, 1);  FINALIZER(resetTransactionTimeout);  FINALIZER(runClearTable);}#if 0TESTCASE("Error4012", ""){  TC_PROPERTY("TransactionDeadlockTimeout", 120000);  INITIALIZER(runLoadTable);  INITIALIZER(getDeadlockTimeout);  INITIALIZER(setDeadlockTimeout);  STEPS(runError4012, 2);  FINALIZER(runClearTable);}#endifNDBT_TESTSUITE_END(testTimeout);int main(int argc, const char** argv){  ndb_init();  myRandom48Init(NdbTick_CurrentMillisecond());  return testTimeout.execute(argc, argv);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?