⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flexbench.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				   (char*)&attrRefValue[nRefLocalOpOffset]);		if (tType == stInsert || tType == stUpdate){	  for (int ca = 1; ca < loopCountAttributes; ca++){	    pOps[countTables]->setValue((char*)attrName[ca],					(char*)&attrRefValue[nRefLocalOpOffset + tAttributeSize*ca]);	  }//for	} else if (tType == stRead || stVerify == tType) {	  int nTableOffset = tAttributeSize * 	    loopCountAttributes *	    countTables ;	  for (int ca = 1; ca < loopCountAttributes; ca++) {	    tTmp = pOps[countTables]->getValue((char*)attrName[ca], 					       (char*)&attrValue[nTableOffset + tAttributeSize*ca]);	  }//for	} else if (stVerifyDelete == tType) {	  if(useLongKeys){	    int nTableOffset = tAttributeSize *	      loopCountAttributes *	      countTables ;	    tTmp = pOps[countTables]->getValue(longKeyAttrName[0], 					       (char*)&attrValue[nTableOffset]);	  } else {	    int nTableOffset = tAttributeSize *	      loopCountAttributes *	      countTables ;	    tTmp = pOps[countTables]->getValue((char*)attrName[0], 					       (char*)&attrValue[nTableOffset]);	  }	}//if      }//for Tables loop      if (tResult != 0)	break;      check = pTrans->execute(Commit);      // Decide what kind of error this is      if ((tSpecialTrans == 1) &&	  (check == -1)) {	// --------------------------------------------------------------------	// A special transaction have been executed, change to check = 0 in	// certain situations.	// --------------------------------------------------------------------	switch (tType) {	case stInsert:          // Insert case	  if (630 == pTrans->getNdbError().code ) {	    check = 0;	    ndbout << "Insert with 4007 was successful" << endl;	  }//if	  break;	case stDelete:          // Delete Case	  if (626 == pTrans->getNdbError().code ) {	    check = 0;	    ndbout << "Delete with 4007 was successful" << endl;	  }//if	  break;	default:	  assert(false);	}//switch      }//if      tSpecialTrans = 0;      if (check == -1) {	if ((stVerifyDelete == tType) && 	    (626 == pTrans->getNdbError().code)) {	  // ----------------------------------------------	  // It's good news - the deleted tuple is gone, 	  // so reset "check" flag	  // ----------------------------------------------	  check = 0 ;	} else {	  int retCode = 	    theErrorData.handleErrorCommon(pTrans->getNdbError());	  if (retCode == 1) {	    ndbout_c("execute: %d, %d, %s", count, tType, 		     pTrans->getNdbError().message );	    ndbout_c("Error code = %d", pTrans->getNdbError().code );	    tResult = 20;	  } else if (retCode == 2) {	    ndbout << "4115 should not happen in flexBench" << endl;	    tResult = 20;	  } else if (retCode == 3) {	    // --------------------------------------------------------------------	    // We are not certain if the transaction was successful or not.	    // We must reexecute but might very well find that the transaction	    // actually was updated. Updates and Reads are no problem here. Inserts	    // will not cause a problem if error code 630 arrives. Deletes will	    // not cause a problem if 626 arrives.	    // --------------------------------------------------------------------	    if ((tType == stInsert) || (tType == stDelete)) {	      tSpecialTrans = 1;	    }//if	  }//if	}//if      }//if      // Check if retries should be made      if (check == -1 && tResult == 0) {	if (tAttemptNo < tRetryAttempts){	  tAttemptNo++;	} else {	  // --------------------------------------------------------------------	  // Too many retries have been made, report error and break out of loop	  // --------------------------------------------------------------------	  ndbout << "Thread" << threadNo;	  ndbout << ": too many errors reported" << endl;	  tResult = 10;	  break;	}//if                  }//if      if (check == 0){	// Go to the next record	count++;	tAttemptNo = 0;#ifdef CEBIT_STAT	// report successful ops	if (statEnable) {	  statOps += loopCountTables;	  if (statOps >= statFreq) {	    statReport(tType, statOps);	    statOps = 0;	  }//if	}//if#endif      }//if      if (stVerify == tType && 0 == check){	int nTableOffset = 0 ;	for (int a = 1 ; a < loopCountAttributes ; a++){	  for (int tables = 0 ; tables < loopCountTables ; tables++){	    nTableOffset = tables*loopCountAttributes*tAttributeSize ;	    if (*(int*)&attrValue[nTableOffset + tAttributeSize*a] != *(int*)&attrRefValue[nRefLocalOpOffset + tAttributeSize*a]){	      ndbout << "Error in verify:" << endl ;	      ndbout << "attrValue[" << nTableOffset + tAttributeSize*a << "] = " << attrValue[a] << endl ;	      ndbout << "attrRefValue[" << nRefLocalOpOffset + tAttributeSize*a << "]" << attrRefValue[nRefLocalOpOffset + tAttributeSize*a] << endl ;	      tResult = 11 ;	      break ;	    }//if	  }//for	}//for      }// if(stVerify ... )      pNdb->closeTransaction(pTrans) ;      }// operations loop#ifdef CEBIT_STAT    // report remaining successful ops    if (statEnable) {      if (statOps > 0) {	statReport(tType, statOps);	statOps = 0;      }//if    }//if#endif  }  delete pNdb;  free(attrValue) ;  free(attrRefValue) ;  free(pOps) ;  if (useLongKeys == true) {    // Only free these areas if they have been allocated    // Otherwise cores will occur    for (Uint32 n = 0; n < tNoOfOperations; n++){      for (Uint32 i = 0; i < tNoOfLongPK; i++) {	free(longKeyAttrValue[n][i]);      }      free(longKeyAttrValue[n]);    }    free(longKeyAttrValue);  } // if  return NULL; // Thread exits}static int readArguments(int argc, const char** argv){  int i = 1;  while (argc > 1){    if (strcmp(argv[i], "-t") == 0){      tNoOfThreads = atoi(argv[i+1]);      if ((tNoOfThreads < 1))         return -1;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-o") == 0){      tNoOfOperations = atoi(argv[i+1]);      if (tNoOfOperations < 1)         return -1;;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-a") == 0){      tNoOfAttributes = atoi(argv[i+1]);      if ((tNoOfAttributes < 2) || (tNoOfAttributes > MAXATTR))         return -1;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-lkn") == 0){     tNoOfLongPK = atoi(argv[i+1]);     useLongKeys = true;      if ((tNoOfLongPK < 1) || (tNoOfLongPK > MAXNOLONGKEY) || 	  (tNoOfLongPK * tSizeOfLongPK) > MAXLONGKEYTOTALSIZE){      	ndbout << "Argument -lkn is not in the proper range." << endl;  	return -1;      }      argc -= 1;      i++;    }else if (strcmp(argv[i], "-lks") == 0){      tSizeOfLongPK = atoi(argv[i+1]);      useLongKeys = true;      if ((tSizeOfLongPK < 1) || (tNoOfLongPK * tSizeOfLongPK) > MAXLONGKEYTOTALSIZE){	ndbout << "Argument -lks is not in the proper range 1 to " << 	  MAXLONGKEYTOTALSIZE << endl;        return -1;      }      argc -= 1;      i++;    }else if (strcmp(argv[i], "-c") == 0){      tNoOfTables = atoi(argv[i+1]);      if ((tNoOfTables < 1) || (tNoOfTables > MAXTABLES))         return -1;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-stdtables") == 0){      theStdTableNameFlag = 1;    }else if (strcmp(argv[i], "-l") == 0){      tNoOfLoops = atoi(argv[i+1]);      if ((tNoOfLoops < 0) || (tNoOfLoops > 100000))         return -1;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-s") == 0){      tAttributeSize = atoi(argv[i+1]);      if ((tAttributeSize < 1) || (tAttributeSize > MAXATTRSIZE))         return -1;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-sleep") == 0){      tSleepTime = atoi(argv[i+1]);      if ((tSleepTime < 1) || (tSleepTime > 3600))         return -1;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-simple") == 0){      theSimpleFlag = 1;    }else if (strcmp(argv[i], "-write") == 0){      theWriteFlag = 1;    }else if (strcmp(argv[i], "-dirty") == 0){      theDirtyFlag = 1;    }else if (strcmp(argv[i], "-no_table_create") == 0){      theTableCreateFlag = 1;    }else if (strcmp(argv[i], "-temp") == 0){      theTempTable = true;    }else if (strcmp(argv[i], "-noverify") == 0){      VerifyFlag = false ;    }else if (theErrorData.parseCmdLineArg(argv, i) == true){      ; //empty, updated in errorArg(..)    }else if (strcmp(argv[i], "-verify") == 0){      VerifyFlag = true ;#ifdef CEBIT_STAT    }else if (strcmp(argv[i], "-statserv") == 0){      if (! (argc > 2))	return -1;      const char *p = argv[i+1];      const char *q = strrchr(p, ':');      if (q == 0)	return -1;      BaseString::snprintf(statHost, sizeof(statHost), "%.*s", q-p, p);      statPort = atoi(q+1);      statEnable = true;      argc -= 1;      i++;    }else if (strcmp(argv[i], "-statfreq") == 0){      if (! (argc > 2))	return -1;      statFreq = atoi(argv[i+1]);      if (statFreq < 1)	return -1;      argc -= 1;      i++;#endif    }else{             return -1;    }    argc -= 1;    i++;  }  return 0;}static void sleepBeforeStartingTest(int seconds){  if (seconds > 0){      ndbout << "Sleeping(" <<seconds << ")...";      NdbSleep_SecSleep(seconds);      ndbout << " done!" << endl;    }}static intcreateTables(Ndb* pMyNdb){  int i;  for (i = 0; i < tNoOfAttributes; i++){    BaseString::snprintf(attrName[i], MAXSTRLEN, "COL%d", i);  }  // Note! Uses only uppercase letters in table name's  // so that we can look at the tables with SQL  for (i = 0; i < tNoOfTables; i++){    if (theStdTableNameFlag == 0){      BaseString::snprintf(tableName[i], MAXSTRLEN, "TAB%d_%d", i, 	       (int)(NdbTick_CurrentMillisecond() / 1000));    } else {      BaseString::snprintf(tableName[i], MAXSTRLEN, "TAB%d", i);    }  }    for(i = 0; i < tNoOfTables; i++){    ndbout << "Creating " << tableName[i] << "... ";        NdbDictionary::Table tmpTable(tableName[i]);        tmpTable.setStoredTable(!theTempTable);        if(useLongKeys){      for(Uint32 i = 0; i < tNoOfLongPK; i++) {	NdbDictionary::Column col(longKeyAttrName[i]);	col.setType(NdbDictionary::Column::Unsigned);	col.setLength(tSizeOfLongPK);	col.setPrimaryKey(true);	tmpTable.addColumn(col);      }    } else {      NdbDictionary::Column col(attrName[0]);      col.setType(NdbDictionary::Column::Unsigned);      col.setLength(1);      col.setPrimaryKey(true);      tmpTable.addColumn(col);    }            NdbDictionary::Column col;    col.setType(NdbDictionary::Column::Unsigned);    col.setLength(tAttributeSize);    for (unsigned j = 1; j < tNoOfAttributes; j++){      col.setName(attrName[j]);      tmpTable.addColumn(col);    }        if(pMyNdb->getDictionary()->createTable(tmpTable) == -1){      return -1;    }    ndbout << "done" << endl;  }    return 0;}      static void input_error(){  ndbout << endl << "Invalid argument!" << endl;  ndbout << endl << "Arguments:" << endl;  ndbout << "   -t Number of threads to start, default 1" << endl;  ndbout << "   -o Number of operations per loop, default 500" << endl;  ndbout << "   -l Number of loops to run, default 1, 0=infinite" << endl;  ndbout << "   -a Number of attributes, default 25" << endl;  ndbout << "   -c Number of tables, default 1" << endl;  ndbout << "   -s Size of each attribute, default 1 (Primary Key is always of size 1," << endl;  ndbout << "      independent of this value)" << endl;  ndbout << "   -lkn Number of long primary keys, default 1" << endl;  ndbout << "   -lks Size of each long primary key, default 1" << endl;  ndbout << "   -simple Use simple read to read from database" << endl;  ndbout << "   -dirty Use dirty read to read from database" << endl;  ndbout << "   -write Use writeTuple in insert and update" << endl;  ndbout << "   -stdtables Use standard table names" << endl;  ndbout << "   -no_table_create Don't create tables in db" << endl;  ndbout << "   -sleep Sleep a number of seconds before running the test, this" << endl;  ndbout << "    can be used so that another flexBench have time to create tables" << endl;  ndbout << "   -temp Use tables without logging" << endl;  ndbout << "   -verify Verify inserts, updates and deletes" << endl ;  theErrorData.printCmdLineArgs(ndbout);  ndbout << endl <<"Returns:" << endl;  ndbout << "\t 0 - Test passed" << endl;  ndbout << "\t 1 - Test failed" << endl;  ndbout << "\t 2 - Invalid arguments" << endl << endl;}// vim: set sw=2:

⌨️ 快捷键说明

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