maingenerator.c

来自「MySQL数据库开发源码 值得一看哦」· C语言 代码 · 共 324 行

C
324
字号
/* 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; either version 2 of the License, or   (at your option) any later version.   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 <ndb_global.h>#include <NdbHost.h>#include <NdbSleep.h>#include <NdbThread.h>#include <NdbMain.h>#include "userInterface.h"#include "dbGenerator.h"static int   numProcesses;static int   numTransactions;static int   numSeconds;static int   numWarmSeconds;static char *testDbName;static ThreadData data[100];typedef struct {   pthread_t threadId;   int waitSeconds;   int toExit;}CheckpointData;static void usage(char *prog){   char  *progname;   /*--------------------------------------------*/   /* Get the name of the program (without path) */   /*--------------------------------------------*/   progname = strrchr(prog, '/');   if (progname == 0)      progname = prog;   else      ++progname;   fprintf(stderr,           "Usage: %s [-db <name>] [-proc <num>] [-transactions <num>] [-time <num>]\n"           "  -db <name>          Specifies the database name\n"           "                      default = '%s'\n"           "  -proc <num>         Specifies that <num> is the number of\n"           "                      concurrent processes. The default is 1.\n"           "  -transactions <num> Specifies that <num> transactions will be\n"           "                      performed. The default is to do a specific time interval\n"           "  -time <num>         Specifies that the test will run for <num> sec.\n"           "                      The default is 10 sec\n"           "  -warm <num>         Specifies the warm-up/cooldown period of <num> sec.\n"           "                      The default is 10 sec\n",           progname, DEFAULTDB);   exit(1);}static void parse_args(int argc,char **argv){   int i;   testDbName      = DEFAULTDB;   numProcesses    = 1;   numTransactions = 0;   numSeconds      = 10;   numWarmSeconds  = 10;   i = 1;   while (i < argc){      if (strcmp("-db",argv[i]) == 0) {         if (i + 1 >= argc) {           usage(argv[0]);           exit(1);         }         testDbName = argv[i + 1];         i += 2;      }      else if (strcmp("-proc",argv[i]) == 0) {         if (i + 1 >= argc) {            usage(argv[0]);            exit(1);         }         if (sscanf(argv[i+1], "%d", &numProcesses) == -1 ||             numProcesses <= 0 || numProcesses > 99) {            fprintf(stderr, "-proc flag requires a positive integer argument [1..99]\n");            usage(argv[0]);            exit(1);         }         i += 2;      }      else if (strcmp("-transactions",argv[i]) == 0) {         if (i + 1 >= argc) {            usage(argv[0]);            exit(1);         }         if (sscanf(argv[i+1], "%d", &numTransactions) == -1 ||             numTransactions < 0) {            fprintf(stderr, "-transactions flag requires a positive integer argument\n");            usage(argv[0]);            exit(1);         }         i += 2;      }      else if (strcmp("-time",argv[i]) == 0) {         if (i + 1 >= argc) {            usage(argv[0]);            exit(1);         }         if (sscanf(argv[i+1], "%d", &numSeconds) == -1 ||             numSeconds < 0) {            fprintf(stderr, "-time flag requires a positive integer argument\n");            usage(argv[0]);            exit(1);         }         i += 2;      }      else if (strcmp("-warm",argv[i]) == 0) {         if (i + 1 >= argc) {            usage(argv[0]);            exit(1);         }         if (sscanf(argv[i+1], "%d", &numWarmSeconds) == -1 ||             numWarmSeconds < 0) {            fprintf(stderr, "-warm flag requires a positive integer argument\n");            usage(argv[0]);            exit(1);         }         i += 2;      }      else         usage(argv[0]);   }}static void print_transaction(const char            *header,		              unsigned long          totalCount,		              TransactionDefinition *trans,		              unsigned int           printBranch,		              unsigned int           printRollback){   double f;   printf("  %s: %d (%.2f%%) Time: %.4f sec TPS = %.0f\n", 	  header,          trans->count,          (double)trans->count / (double)totalCount * 100.0,          trans->benchTime,          trans->tps);   if( printBranch ){      if( trans->count == 0 )         f = 0.0;      else         f = (double)trans->branchExecuted / (double)trans->count * 100.0;      printf("      Branches Executed: %d (%.2f%%)\n", trans->branchExecuted, f);   }   if( printRollback ){      if( trans->count == 0 )         f = 0.0;      else         f = (double)trans->rollbackExecuted / (double)trans->count * 100.0;      printf("      Rollback Executed: %d (%.2f%%)\n", trans->rollbackExecuted, f);   }}void print_stats_sync(const char       *title,		      unsigned int      length,		      unsigned int      transactionFlag,		      GeneratorStatistics *gen,		      int numProc){   int    i;   char buf[10];   char name[100];   name[0] = 0;   NdbHost_GetHostName(name);      printf("\n------ %s ------\n",title);   printf("Length        : %d %s\n",          length,          transactionFlag ? "Transactions" : "sec");   printf("Processor     : %s\n", name);   printf("Number of Proc: %d\n",numProc);   printf("\n");   if( gen->totalTransactions == 0 ) {      printf("   No Transactions for this test\n");   }   else {      for(i = 0; i < 5; i++) {         sprintf(buf, "T%d",i+1);         print_transaction(buf,                           gen->totalTransactions,                           &gen->transactions[i],                           i >= 2,                           i >= 3 );      }      printf("\n");      printf("  Overall Statistics:\n");      printf("     Transactions: %d\n", gen->totalTransactions);      printf("     Inner       : %.0f TPS\n",gen->innerTps);      printf("     Outer       : %.0f TPS\n",gen->outerTps);      printf("\n");   }}static void *threadRoutine(void *arg){   UserHandle *uh;   ThreadData *data = (ThreadData *)arg;      uh = userDbConnect(0, testDbName);   NdbSleep_MilliSleep(data->threadId);   dbGenerator(uh,data);   userDbDisconnect(uh);   pthread_exit(0);   return(0);}NDB_COMMAND(DbGenerator, "DbGenerator", "DbGenerator", "DbGenerator", 16384){   int i;   int j;   GeneratorStatistics  stats;   GeneratorStatistics *p;   CheckpointData cd;   parse_args(argc,argv);   printf("\nStarting Test with %d process(es) for %d %s\n",           numProcesses,           numTransactions ? numTransactions : numSeconds,           numTransactions ? "Transactions" : "sec");   printf("   WarmUp/coolDown = %d sec\n", numWarmSeconds);   /*   cd.waitSeconds = 300;   cd.toExit      = 0;   pthread_create(&cd.threadId, 0, checkpointRoutine, &cd);   */   for(i = 0; i < numProcesses; i++) {      data[i].warmUpSeconds   = numWarmSeconds;      data[i].testSeconds     = numSeconds;      data[i].coolDownSeconds = numWarmSeconds;      data[i].numTransactions = numTransactions;      data[i].randomSeed      = time(0)+i;      j = pthread_create(&data[i].threadId, 0, threadRoutine, &data[i]);      if(j != 0){	perror("Failed to create thread");      }   }   /*--------------------------------*/   /* Wait for all processes to exit */   /*--------------------------------*/   for(i = 0; i < numProcesses; i++)      pthread_join(data[i].threadId, 0);   printf("All threads have finished\n");   cd.toExit = 1;   /*-------------------------------------------*/   /* Clear all structures for total statistics */   /*-------------------------------------------*/   stats.totalTransactions = 0;   stats.outerTps          = 0.0;   stats.innerTps          = 0.0;   for(i = 0; i < NUM_TRANSACTION_TYPES; i++ ) {      stats.transactions[i].benchTime        = 0.0;      stats.transactions[i].count            = 0;      stats.transactions[i].tps              = 0.0;      stats.transactions[i].branchExecuted   = 0;      stats.transactions[i].rollbackExecuted = 0;   }   /*--------------------------------*/   /* Add the values for all Threads */   /*--------------------------------*/   for(i = 0; i < numProcesses; i++) {      p = &data[i].generator;      stats.totalTransactions += p->totalTransactions;      stats.outerTps          += p->outerTps;      stats.innerTps          += p->innerTps;      for(j = 0; j < NUM_TRANSACTION_TYPES; j++ ) {         stats.transactions[j].benchTime        += p->transactions[j].benchTime;         stats.transactions[j].count            += p->transactions[j].count;         stats.transactions[j].tps              += p->transactions[j].tps;         stats.transactions[j].branchExecuted   += p->transactions[j].branchExecuted;         stats.transactions[j].rollbackExecuted += p->transactions[j].rollbackExecuted;      }   }   print_stats_sync("Test Results", 		    numTransactions ? numTransactions : numSeconds,		    numTransactions ? 1 : 0,		    &stats,		    numProcesses);   return(0);}

⌨️ 快捷键说明

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