testtimeout.cpp

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

CPP
562
字号
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; version 2 of the License.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <NDBT.hpp>#include <NDBT_Test.hpp>#include <HugoTransactions.hpp>#include <UtilTransactions.hpp>#include <random.h>#include <NdbConfig.hpp>#include <signaldata/DumpStateOrd.hpp>#define TIMEOUT (Uint32)3000Uint32 g_org_timeout = 3000;Uint32 g_org_deadlock = 3000;intsetTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){  NdbRestarter restarter;  int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT);  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;}intresetTransactionTimeout(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;}intsetDeadlockTimeout(NDBT_Context* ctx, NDBT_Step* step){  NdbRestarter restarter;  int timeout = ctx->getProperty("TransactionDeadlockTimeout", TIMEOUT);    NdbConfig conf(GETNDB(step)->getNodeId()+1);  unsigned int nodeId = conf.getMasterNodeId();  if (!conf.getProperty(nodeId,			NODE_TYPE_DB, 			CFG_DB_TRANSACTION_DEADLOCK_TIMEOUT,			&g_org_deadlock))    return NDBT_FAILED;    g_err << "Setting timeout: " << timeout << endl;  int val[] = { DumpStateOrd::TcSetTransactionTimeout, timeout };  if(restarter.dumpStateAllNodes(val, 2) != 0){    return NDBT_FAILED;  }    return NDBT_OK;}intgetDeadlockTimeout(NDBT_Context* ctx, NDBT_Step* step){  NdbRestarter restarter;    Uint32 val = 0;  NdbConfig conf(GETNDB(step)->getNodeId()+1);  unsigned int nodeId = conf.getMasterNodeId();  if (!conf.getProperty(nodeId,			NODE_TYPE_DB, 			CFG_DB_TRANSACTION_DEADLOCK_TIMEOUT,			&val))    return NDBT_FAILED;  if (val < 120000)    val = 120000;  ctx->setProperty("TransactionDeadlockTimeout", 4*val);    return NDBT_OK;}intresetDeadlockTimeout(NDBT_Context* ctx, NDBT_Step* step){  NdbRestarter restarter;    int val[] = { DumpStateOrd::TcSetTransactionTimeout, g_org_deadlock };  if(restarter.dumpStateAllNodes(val, 2) != 0){    return NDBT_FAILED;  }    return NDBT_OK;}int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){  int records = ctx->getNumRecords();  HugoTransactions hugoTrans(*ctx->getTab());  if (hugoTrans.loadTable(GETNDB(step), records) != 0){    return NDBT_FAILED;  }  return NDBT_OK;}int runClearTable(NDBT_Context* ctx, NDBT_Step* step){  int records = ctx->getNumRecords();    UtilTransactions utilTrans(*ctx->getTab());  if (utilTrans.clearTable2(GETNDB(step),  records) != 0){    return NDBT_FAILED;  }  return NDBT_OK;}#define CHECK(b) if (!(b)) { \  ndbout << "ERR: "<< step->getName() \         << " failed on line " << __LINE__ << endl; \  result = NDBT_FAILED; \  break; }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 timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT);  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) != 0){	  g_err << stepNo << ": Fail" << __LINE__ << endl;	  result = NDBT_FAILED; break;	}	break;      case 2:	if(hugoOps.pkUpdateRecord(pNdb, stepNo) != 0){	  g_err << stepNo << ": Fail" << __LINE__ << endl;	  result = NDBT_FAILED; break;	}	break;      case 3:	if(hugoOps.pkDeleteRecord(pNdb, stepNo) != 0){	  g_err << stepNo << ": Fail" << __LINE__ << endl;	  result = NDBT_FAILED; break;	}	break;      case 4:	if(hugoOps.pkInsertRecord(pNdb, stepNo+records+l) != 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) != 0){	  g_err << stepNo << ": Fail" << __LINE__ << endl;	  result = NDBT_FAILED; break;	}	break;      case 2:	if(hugoOps.pkUpdateRecord(pNdb, stepNo) != 0){	  g_err << stepNo << ": Fail" << __LINE__ << endl;	  result = NDBT_FAILED; break;	}	break;      case 3:	if(hugoOps.pkDeleteRecord(pNdb, stepNo) != 0){	  g_err << stepNo << ": Fail" << __LINE__ << endl;	  result = NDBT_FAILED; break;	}	break;      case 4:	if(hugoOps.pkInsertRecord(pNdb, stepNo+2*records+l) != 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;}int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){  int result = NDBT_OK;  int loops = ctx->getNumLoops();  int stepNo = step->getStepNo();  int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT);  int maxSleep = (int)(timeout * 0.5);  ndbout << "TransactionInactiveTimeout="<< timeout	 << ", maxSleep="<<maxSleep<<endl;  HugoOperations hugoOps(*ctx->getTab());  Ndb* pNdb = GETNDB(step);  for (int l = 0; l < loops && result == NDBT_OK; l++){

⌨️ 快捷键说明

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