mainGenerator.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <NdbHost.h>
  15. #include <NdbSleep.h>
  16. #include <NdbThread.h>
  17. #include <NdbMain.h>
  18. #include "userInterface.h"
  19. #include "dbGenerator.h"
  20. static int   numProcesses;
  21. static int   numTransactions;
  22. static int   numSeconds;
  23. static int   numWarmSeconds;
  24. static char *testDbName;
  25. static ThreadData data[100];
  26. typedef struct {
  27.    pthread_t threadId;
  28.    int waitSeconds;
  29.    int toExit;
  30. }CheckpointData;
  31. static void usage(char *prog)
  32. {
  33.    char  *progname;
  34.    /*--------------------------------------------*/
  35.    /* Get the name of the program (without path) */
  36.    /*--------------------------------------------*/
  37.    progname = strrchr(prog, '/');
  38.    if (progname == 0)
  39.       progname = prog;
  40.    else
  41.       ++progname;
  42.    fprintf(stderr,
  43.            "Usage: %s [-db <name>] [-proc <num>] [-transactions <num>] [-time <num>]n"
  44.            "  -db <name>          Specifies the database namen"
  45.            "                      default = '%s'n"
  46.            "  -proc <num>         Specifies that <num> is the number ofn"
  47.            "                      concurrent processes. The default is 1.n"
  48.            "  -transactions <num> Specifies that <num> transactions will ben"
  49.            "                      performed. The default is to do a specific time intervaln"
  50.            "  -time <num>         Specifies that the test will run for <num> sec.n"
  51.            "                      The default is 10 secn"
  52.            "  -warm <num>         Specifies the warm-up/cooldown period of <num> sec.n"
  53.            "                      The default is 10 secn",
  54.            progname, DEFAULTDB);
  55.    exit(1);
  56. }
  57. static void parse_args(int argc,char **argv)
  58. {
  59.    int i;
  60.    testDbName      = DEFAULTDB;
  61.    numProcesses    = 1;
  62.    numTransactions = 0;
  63.    numSeconds      = 10;
  64.    numWarmSeconds  = 10;
  65.    i = 1;
  66.    while (i < argc){
  67.       if (strcmp("-db",argv[i]) == 0) {
  68.          if (i + 1 >= argc) {
  69.            usage(argv[0]);
  70.            exit(1);
  71.          }
  72.          testDbName = argv[i + 1];
  73.          i += 2;
  74.       }
  75.       else if (strcmp("-proc",argv[i]) == 0) {
  76.          if (i + 1 >= argc) {
  77.             usage(argv[0]);
  78.             exit(1);
  79.          }
  80.          if (sscanf(argv[i+1], "%d", &numProcesses) == -1 ||
  81.              numProcesses <= 0 || numProcesses > 99) {
  82.             fprintf(stderr, "-proc flag requires a positive integer argument [1..99]n");
  83.             usage(argv[0]);
  84.             exit(1);
  85.          }
  86.          i += 2;
  87.       }
  88.       else if (strcmp("-transactions",argv[i]) == 0) {
  89.          if (i + 1 >= argc) {
  90.             usage(argv[0]);
  91.             exit(1);
  92.          }
  93.          if (sscanf(argv[i+1], "%d", &numTransactions) == -1 ||
  94.              numTransactions < 0) {
  95.             fprintf(stderr, "-transactions flag requires a positive integer argumentn");
  96.             usage(argv[0]);
  97.             exit(1);
  98.          }
  99.          i += 2;
  100.       }
  101.       else if (strcmp("-time",argv[i]) == 0) {
  102.          if (i + 1 >= argc) {
  103.             usage(argv[0]);
  104.             exit(1);
  105.          }
  106.          if (sscanf(argv[i+1], "%d", &numSeconds) == -1 ||
  107.              numSeconds < 0) {
  108.             fprintf(stderr, "-time flag requires a positive integer argumentn");
  109.             usage(argv[0]);
  110.             exit(1);
  111.          }
  112.          i += 2;
  113.       }
  114.       else if (strcmp("-warm",argv[i]) == 0) {
  115.          if (i + 1 >= argc) {
  116.             usage(argv[0]);
  117.             exit(1);
  118.          }
  119.          if (sscanf(argv[i+1], "%d", &numWarmSeconds) == -1 ||
  120.              numWarmSeconds < 0) {
  121.             fprintf(stderr, "-warm flag requires a positive integer argumentn");
  122.             usage(argv[0]);
  123.             exit(1);
  124.          }
  125.          i += 2;
  126.       }
  127.       else
  128.          usage(argv[0]);
  129.    }
  130. }
  131. static void print_transaction(const char            *header,
  132.               unsigned long          totalCount,
  133.               TransactionDefinition *trans,
  134.               unsigned int           printBranch,
  135.               unsigned int           printRollback)
  136. {
  137.    double f;
  138.    printf("  %s: %d (%.2f%%) Time: %.4f sec TPS = %.0fn", 
  139.   header,
  140.           trans->count,
  141.           (double)trans->count / (double)totalCount * 100.0,
  142.           trans->benchTime,
  143.           trans->tps);
  144.    if( printBranch ){
  145.       if( trans->count == 0 )
  146.          f = 0.0;
  147.       else
  148.          f = (double)trans->branchExecuted / (double)trans->count * 100.0;
  149.       printf("      Branches Executed: %d (%.2f%%)n", trans->branchExecuted, f);
  150.    }
  151.    if( printRollback ){
  152.       if( trans->count == 0 )
  153.          f = 0.0;
  154.       else
  155.          f = (double)trans->rollbackExecuted / (double)trans->count * 100.0;
  156.       printf("      Rollback Executed: %d (%.2f%%)n", trans->rollbackExecuted, f);
  157.    }
  158. }
  159. void print_stats_sync(const char       *title,
  160.       unsigned int      length,
  161.       unsigned int      transactionFlag,
  162.       GeneratorStatistics *gen,
  163.       int numProc)
  164. {
  165.    int    i;
  166.    char buf[10];
  167.    char name[100];
  168.    name[0] = 0;
  169.    NdbHost_GetHostName(name);
  170.    
  171.    printf("n------ %s ------n",title);
  172.    printf("Length        : %d %sn",
  173.           length,
  174.           transactionFlag ? "Transactions" : "sec");
  175.    printf("Processor     : %sn", name);
  176.    printf("Number of Proc: %dn",numProc);
  177.    printf("n");
  178.    if( gen->totalTransactions == 0 ) {
  179.       printf("   No Transactions for this testn");
  180.    }
  181.    else {
  182.       for(i = 0; i < 5; i++) {
  183.          sprintf(buf, "T%d",i+1);
  184.          print_transaction(buf,
  185.                            gen->totalTransactions,
  186.                            &gen->transactions[i],
  187.                            i >= 2,
  188.                            i >= 3 );
  189.       }
  190.       printf("n");
  191.       printf("  Overall Statistics:n");
  192.       printf("     Transactions: %dn", gen->totalTransactions);
  193.       printf("     Inner       : %.0f TPSn",gen->innerTps);
  194.       printf("     Outer       : %.0f TPSn",gen->outerTps);
  195.       printf("n");
  196.    }
  197. }
  198. static void *threadRoutine(void *arg)
  199. {
  200.    UserHandle *uh;
  201.    ThreadData *data = (ThreadData *)arg;
  202.    
  203.    uh = userDbConnect(0, testDbName);
  204.    NdbSleep_MilliSleep(data->threadId);
  205.    dbGenerator(uh,data);
  206.    userDbDisconnect(uh);
  207.    pthread_exit(0);
  208.    return(0);
  209. }
  210. NDB_COMMAND(DbGenerator, "DbGenerator", "DbGenerator", "DbGenerator", 16384)
  211. {
  212.    int i;
  213.    int j;
  214.    GeneratorStatistics  stats;
  215.    GeneratorStatistics *p;
  216.    CheckpointData cd;
  217.    parse_args(argc,argv);
  218.    printf("nStarting Test with %d process(es) for %d %sn",
  219.            numProcesses,
  220.            numTransactions ? numTransactions : numSeconds,
  221.            numTransactions ? "Transactions" : "sec");
  222.    printf("   WarmUp/coolDown = %d secn", numWarmSeconds);
  223.    /*
  224.    cd.waitSeconds = 300;
  225.    cd.toExit      = 0;
  226.    pthread_create(&cd.threadId, 0, checkpointRoutine, &cd);
  227.    */
  228.    for(i = 0; i < numProcesses; i++) {
  229.       data[i].warmUpSeconds   = numWarmSeconds;
  230.       data[i].testSeconds     = numSeconds;
  231.       data[i].coolDownSeconds = numWarmSeconds;
  232.       data[i].numTransactions = numTransactions;
  233.       data[i].randomSeed      = time(0)+i;
  234.       j = pthread_create(&data[i].threadId, 0, threadRoutine, &data[i]);
  235.       if(j != 0){
  236. perror("Failed to create thread");
  237.       }
  238.    }
  239.    /*--------------------------------*/
  240.    /* Wait for all processes to exit */
  241.    /*--------------------------------*/
  242.    for(i = 0; i < numProcesses; i++)
  243.       pthread_join(data[i].threadId, 0);
  244.    printf("All threads have finishedn");
  245.    cd.toExit = 1;
  246.    /*-------------------------------------------*/
  247.    /* Clear all structures for total statistics */
  248.    /*-------------------------------------------*/
  249.    stats.totalTransactions = 0;
  250.    stats.outerTps          = 0.0;
  251.    stats.innerTps          = 0.0;
  252.    for(i = 0; i < NUM_TRANSACTION_TYPES; i++ ) {
  253.       stats.transactions[i].benchTime        = 0.0;
  254.       stats.transactions[i].count            = 0;
  255.       stats.transactions[i].tps              = 0.0;
  256.       stats.transactions[i].branchExecuted   = 0;
  257.       stats.transactions[i].rollbackExecuted = 0;
  258.    }
  259.    /*--------------------------------*/
  260.    /* Add the values for all Threads */
  261.    /*--------------------------------*/
  262.    for(i = 0; i < numProcesses; i++) {
  263.       p = &data[i].generator;
  264.       stats.totalTransactions += p->totalTransactions;
  265.       stats.outerTps          += p->outerTps;
  266.       stats.innerTps          += p->innerTps;
  267.       for(j = 0; j < NUM_TRANSACTION_TYPES; j++ ) {
  268.          stats.transactions[j].benchTime        += p->transactions[j].benchTime;
  269.          stats.transactions[j].count            += p->transactions[j].count;
  270.          stats.transactions[j].tps              += p->transactions[j].tps;
  271.          stats.transactions[j].branchExecuted   += p->transactions[j].branchExecuted;
  272.          stats.transactions[j].rollbackExecuted += p->transactions[j].rollbackExecuted;
  273.       }
  274.    }
  275.    print_stats_sync("Test Results", 
  276.     numTransactions ? numTransactions : numSeconds,
  277.     numTransactions ? 1 : 0,
  278.     &stats,
  279.     numProcesses);
  280.    return(0);
  281. }