summaryrefslogtreecommitdiff
path: root/storage/ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.c')
-rw-r--r--storage/ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.c543
1 files changed, 543 insertions, 0 deletions
diff --git a/storage/ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.c b/storage/ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.c
new file mode 100644
index 00000000000..7484c7647f5
--- /dev/null
+++ b/storage/ndb/test/ndbapi/old_dirs/lmc-bench/src/generator/dbGenerator.c
@@ -0,0 +1,543 @@
+/* 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 */
+
+/***************************************************************
+* I N C L U D E D F I L E S *
+***************************************************************/
+
+#include <ndb_global.h>
+#include "dbGenerator.h"
+
+/***************************************************************
+* L O C A L C O N S T A N T S *
+***************************************************************/
+
+/***************************************************************
+* L O C A L D A T A S T R U C T U R E S *
+***************************************************************/
+
+/***************************************************************
+* L O C A L F U N C T I O N S *
+***************************************************************/
+
+static void getRandomSubscriberNumber(SubscriberNumber number);
+static void getRandomServerId(ServerId *serverId);
+static void getRandomChangedBy(ChangedBy changedBy);
+static void getRandomChangedTime(ChangedTime changedTime);
+
+static void clearTransaction(TransactionDefinition *trans);
+static void initGeneratorStatistics(GeneratorStatistics *gen);
+
+static void doOneTransaction(UserHandle *uh, GeneratorStatistics *gen);
+static void doTransaction_T1(UserHandle *uh, GeneratorStatistics *gen);
+static void doTransaction_T2(UserHandle *uh, GeneratorStatistics *gen);
+static void doTransaction_T3(UserHandle *uh, GeneratorStatistics *gen);
+static void doTransaction_T4(UserHandle *uh, GeneratorStatistics *gen);
+static void doTransaction_T5(UserHandle *uh, GeneratorStatistics *gen);
+
+/***************************************************************
+* L O C A L D A T A *
+***************************************************************/
+
+static SequenceValues transactionDefinition[] = {
+ {25, 1},
+ {25, 2},
+ {20, 3},
+ {15, 4},
+ {15, 5},
+ {0, 0}
+};
+
+static SequenceValues rollbackDefinition[] = {
+ {98, 0},
+ {2 , 1},
+ {0, 0}
+};
+
+static int maxsize = 0;
+
+/***************************************************************
+* P U B L I C D A T A *
+***************************************************************/
+
+/***************************************************************
+****************************************************************
+* L O C A L F U N C T I O N S C O D E S E C T I O N *
+****************************************************************
+***************************************************************/
+
+static void getRandomSubscriberNumber(SubscriberNumber number)
+{
+ uint32 tmp;
+ char sbuf[SUBSCRIBER_NUMBER_LENGTH + 1];
+ tmp = myRandom48(NO_OF_SUBSCRIBERS);
+ sprintf(sbuf, "%.*d", SUBSCRIBER_NUMBER_LENGTH, tmp);
+ memcpy(number, sbuf, SUBSCRIBER_NUMBER_LENGTH);
+}
+
+static void getRandomServerId(ServerId *serverId)
+{
+ *serverId = myRandom48(NO_OF_SERVERS);
+}
+
+static void getRandomChangedBy(ChangedBy changedBy)
+{
+ memset(changedBy, myRandom48(26)+'A', CHANGED_BY_LENGTH);
+ changedBy[CHANGED_BY_LENGTH] = 0;
+}
+
+static void getRandomChangedTime(ChangedTime changedTime)
+{
+ memset(changedTime, myRandom48(26)+'A', CHANGED_TIME_LENGTH);
+ changedTime[CHANGED_TIME_LENGTH] = 0;
+}
+
+static void clearTransaction(TransactionDefinition *trans)
+{
+ trans->benchTime = 0.0;
+ trans->count = 0;
+ trans->branchExecuted = 0;
+ trans->rollbackExecuted = 0;
+}
+
+static int listFull(SessionList *list)
+{
+ return(list->numberInList == SESSION_LIST_LENGTH);
+}
+
+static int listEmpty(SessionList *list)
+{
+ return(list->numberInList == 0);
+}
+
+static void insertSession(SessionList *list,
+ SubscriberNumber number,
+ ServerId serverId)
+{
+ SessionElement *e;
+ if( listFull(list) ) return;
+
+ e = &list->list[list->writeIndex];
+
+ strcpy(e->subscriberNumber, number);
+ e->serverId = serverId;
+
+ list->writeIndex = (list->writeIndex + 1) % SESSION_LIST_LENGTH;
+ list->numberInList++;
+
+if( list->numberInList > maxsize )
+maxsize = list->numberInList;
+}
+
+static SessionElement *getNextSession(SessionList *list)
+{
+ if( listEmpty(list) ) return(0);
+
+ return(&list->list[list->readIndex]);
+}
+
+static void deleteSession(SessionList *list)
+{
+ if( listEmpty(list) ) return;
+
+ list->readIndex = (list->readIndex + 1) % SESSION_LIST_LENGTH;
+ list->numberInList--;
+}
+
+static void initGeneratorStatistics(GeneratorStatistics *gen)
+{
+ int i;
+
+ if( initSequence(&gen->transactionSequence,
+ transactionDefinition) != 0 ) {
+ printf("could not set the transaction types\n");
+ exit(0);
+ }
+
+ if( initSequence(&gen->rollbackSequenceT4,
+ rollbackDefinition) != 0 ) {
+ printf("could not set the rollback sequence\n");
+ exit(0);
+ }
+
+ if( initSequence(&gen->rollbackSequenceT5,
+ rollbackDefinition) != 0 ) {
+ printf("could not set the rollback sequence\n");
+ exit(0);
+ }
+
+ for(i = 0; i < NUM_TRANSACTION_TYPES; i++ )
+ clearTransaction(&gen->transactions[i]);
+
+ gen->totalTransactions = 0;
+
+ gen->activeSessions.numberInList = 0;
+ gen->activeSessions.readIndex = 0;
+ gen->activeSessions.writeIndex = 0;
+}
+
+
+static void doOneTransaction(UserHandle *uh, GeneratorStatistics *gen)
+{
+ unsigned int transactionType;
+
+ transactionType = getNextRandom(&gen->transactionSequence);
+
+ switch(transactionType) {
+ case 1:
+ doTransaction_T1(uh, gen);
+ break;
+ case 2:
+ doTransaction_T2(uh, gen);
+ break;
+ case 3:
+ doTransaction_T3(uh, gen);
+ break;
+ case 4:
+ doTransaction_T4(uh, gen);
+ break;
+ case 5:
+ doTransaction_T5(uh, gen);
+ break;
+ default:
+ printf("Unknown transaction type: %d\n", transactionType);
+ }
+
+ gen->totalTransactions++;
+}
+
+static void doTransaction_T1(UserHandle *uh, GeneratorStatistics *gen)
+{
+ SubscriberNumber number;
+ Location new_location;
+ ChangedBy changed_by;
+ ChangedTime changed_time;
+
+ double start_time;
+ double end_time;
+ double transaction_time;
+
+ unsigned int tid = 0;
+
+ /*----------------*/
+ /* Init arguments */
+ /*----------------*/
+ getRandomSubscriberNumber(number);
+ getRandomChangedBy(changed_by);
+ getRandomChangedTime(changed_time);
+ new_location = changed_by[0];
+
+ /*-----------------*/
+ /* Run transaction */
+ /*-----------------*/
+ start_time = userGetTimeSync();
+ userTransaction_T1(uh,
+ number,
+ new_location,
+ changed_by,
+ changed_time);
+ end_time = userGetTimeSync();
+
+ /*-------------------*/
+ /* Update Statistics */
+ /*-------------------*/
+ transaction_time = end_time - start_time;
+ gen->transactions[tid].benchTime += transaction_time;
+ gen->transactions[tid].count++;
+}
+
+static void doTransaction_T2(UserHandle *uh, GeneratorStatistics *gen)
+{
+ SubscriberNumber number;
+ Location new_location;
+ ChangedBy changed_by;
+ ChangedTime changed_time;
+ SubscriberName subscriberName;
+
+ double start_time;
+ double end_time;
+ double transaction_time;
+
+ unsigned int tid = 1;
+
+ /*----------------*/
+ /* Init arguments */
+ /*----------------*/
+ getRandomSubscriberNumber(number);
+
+ /*-----------------*/
+ /* Run transaction */
+ /*-----------------*/
+ start_time = userGetTimeSync();
+ userTransaction_T2(uh,
+ number,
+ &new_location,
+ changed_by,
+ changed_time,
+ subscriberName);
+ end_time = userGetTimeSync();
+
+ /*-------------------*/
+ /* Update Statistics */
+ /*-------------------*/
+ transaction_time = end_time - start_time;
+ gen->transactions[tid].benchTime += transaction_time;
+ gen->transactions[tid].count++;
+}
+
+static void doTransaction_T3(UserHandle *uh, GeneratorStatistics *gen)
+{
+ SubscriberNumber number;
+ ServerId serverId;
+ ServerBit serverBit;
+ SessionDetails sessionDetails;
+ unsigned int branchExecuted;
+ SessionElement *se;
+
+ double start_time;
+ double end_time;
+ double transaction_time;
+
+ unsigned int tid = 2;
+
+ /*----------------*/
+ /* Init arguments */
+ /*----------------*/
+ se = getNextSession(&gen->activeSessions);
+ if( se ) {
+ strcpy(number, se->subscriberNumber);
+ serverId = se->serverId;
+ }
+ else {
+ getRandomSubscriberNumber(number);
+ getRandomServerId(&serverId);
+ }
+
+ serverBit = 1 << serverId;
+
+ /*-----------------*/
+ /* Run transaction */
+ /*-----------------*/
+ start_time = userGetTimeSync();
+ userTransaction_T3(uh,
+ number,
+ serverId,
+ serverBit,
+ sessionDetails,
+ &branchExecuted);
+ end_time = userGetTimeSync();
+
+ /*-------------------*/
+ /* Update Statistics */
+ /*-------------------*/
+ transaction_time = end_time - start_time;
+ gen->transactions[tid].benchTime += transaction_time;
+ gen->transactions[tid].count++;
+
+ if(branchExecuted)
+ gen->transactions[tid].branchExecuted++;
+}
+
+static void doTransaction_T4(UserHandle *uh, GeneratorStatistics *gen)
+{
+ SubscriberNumber number;
+ ServerId serverId;
+ ServerBit serverBit;
+ SessionDetails sessionDetails;
+ unsigned int branchExecuted;
+ unsigned int rollback;
+
+ double start_time;
+ double end_time;
+ double transaction_time;
+
+ unsigned int tid = 3;
+
+ /*----------------*/
+ /* Init arguments */
+ /*----------------*/
+ getRandomSubscriberNumber(number);
+ getRandomServerId(&serverId);
+
+ serverBit = 1 << serverId;
+ rollback = getNextRandom(&gen->rollbackSequenceT4);
+
+ memset(sessionDetails, myRandom48(26)+'A', SESSION_DETAILS_LENGTH);
+ sessionDetails[SESSION_DETAILS_LENGTH] = 0;
+
+ /*-----------------*/
+ /* Run transaction */
+ /*-----------------*/
+ start_time = userGetTimeSync();
+ userTransaction_T4(uh,
+ number,
+ serverId,
+ serverBit,
+ sessionDetails,
+ rollback,
+ &branchExecuted);
+ end_time = userGetTimeSync();
+
+ /*-------------------*/
+ /* Update Statistics */
+ /*-------------------*/
+ transaction_time = end_time - start_time;
+ gen->transactions[tid].benchTime += transaction_time;
+ gen->transactions[tid].count++;
+
+ if(branchExecuted)
+ gen->transactions[tid].branchExecuted++;
+ if(rollback)
+ gen->transactions[tid].rollbackExecuted++;
+
+ if( branchExecuted && !rollback ) {
+ insertSession(&gen->activeSessions, number, serverId);
+ }
+}
+
+static void doTransaction_T5(UserHandle *uh, GeneratorStatistics *gen)
+{
+ SubscriberNumber number;
+ ServerId serverId;
+ ServerBit serverBit;
+ unsigned int branchExecuted;
+ unsigned int rollback;
+ SessionElement *se;
+
+ double start_time;
+ double end_time;
+ double transaction_time;
+
+ unsigned int tid = 4;
+
+ /*----------------*/
+ /* Init arguments */
+ /*----------------*/
+ se = getNextSession(&gen->activeSessions);
+ if( se ) {
+ strcpy(number, se->subscriberNumber);
+ serverId = se->serverId;
+ }
+ else {
+ getRandomSubscriberNumber(number);
+ getRandomServerId(&serverId);
+ }
+
+ serverBit = 1 << serverId;
+ rollback = getNextRandom(&gen->rollbackSequenceT5);
+
+ /*-----------------*/
+ /* Run transaction */
+ /*-----------------*/
+ start_time = userGetTimeSync();
+ userTransaction_T5(uh,
+ number,
+ serverId,
+ serverBit,
+ rollback,
+ &branchExecuted);
+ end_time = userGetTimeSync();
+
+ /*-------------------*/
+ /* Update Statistics */
+ /*-------------------*/
+ transaction_time = end_time - start_time;
+ gen->transactions[tid].benchTime += transaction_time;
+ gen->transactions[tid].count++;
+
+ if(branchExecuted)
+ gen->transactions[tid].branchExecuted++;
+ if(rollback)
+ gen->transactions[tid].rollbackExecuted++;
+
+ if( se && !rollback) {
+ deleteSession(&gen->activeSessions);
+ }
+}
+
+/***************************************************************
+****************************************************************
+* P U B L I C F U N C T I O N S C O D E S E C T I O N *
+****************************************************************
+***************************************************************/
+
+
+void dbGenerator(UserHandle *uh, ThreadData *data)
+{
+ GeneratorStatistics rg_warmUp;
+ GeneratorStatistics rg_coolDown;
+ GeneratorStatistics *st;
+ double periodStop;
+ double benchTimeStart;
+ double benchTimeEnd;
+ int i;
+
+ myRandom48Init(data->randomSeed);
+
+ initGeneratorStatistics(&rg_warmUp);
+ initGeneratorStatistics(&data->generator);
+ initGeneratorStatistics(&rg_coolDown);
+
+ /*----------------*/
+ /* warm up period */
+ /*----------------*/
+ periodStop = userGetTimeSync() + (double)data->warmUpSeconds;
+ while(userGetTimeSync() < periodStop){
+ doOneTransaction(uh, &rg_warmUp);
+ }
+
+ /*-------------------------*/
+ /* normal benchmark period */
+ /*-------------------------*/
+ benchTimeStart = userGetTimeSync();
+
+ if( data->numTransactions > 0 ) {
+ for(i = 0; i < data->numTransactions; i++)
+ doOneTransaction(uh, &data->generator);
+ }
+ else {
+ periodStop = benchTimeStart + (double)data->testSeconds;
+ while(userGetTimeSync() < periodStop)
+ doOneTransaction(uh, &data->generator);
+ }
+
+ benchTimeEnd = userGetTimeSync();
+
+ /*------------------*/
+ /* cool down period */
+ /*------------------*/
+ periodStop = benchTimeEnd + data->coolDownSeconds;
+ while(userGetTimeSync() < periodStop){
+ doOneTransaction(uh, &rg_coolDown);
+ }
+
+ /*---------------------------------------------------------*/
+ /* add the times for all transaction for inner loop timing */
+ /*---------------------------------------------------------*/
+ st = &data->generator;
+ st->innerLoopTime = 0.0;
+ for(i = 0 ; i < NUM_TRANSACTION_TYPES; i++) {
+ st->innerLoopTime += st->transactions[i].benchTime;
+ st->transactions[i].tps = getTps(st->transactions[i].count,
+ st->transactions[i].benchTime);
+ }
+
+ st->outerLoopTime = benchTimeEnd - benchTimeStart;
+ st->outerTps = getTps(st->totalTransactions, st->outerLoopTime);
+ st->innerTps = getTps(st->totalTransactions, st->innerLoopTime);
+
+ /* printf("maxsize = %d\n",maxsize); */
+}