📄 sbench.c
字号:
"SET Abalance = Abalance + %d WHERE Aid = %d", delta, aid); rc = sqlite3_exec(sqlite, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { stat_counts[1] += 1; goto transfail; } sqlite3_free(sql); sql = sqlite3_mprintf("SELECT Abalance " "FROM accounts WHERE Aid = %d", aid); rc = sqlite3_get_table(sqlite, sql, &rows, &nrows, &ncols, NULL); if (rc != SQLITE_OK) { stat_counts[2] += 1; goto transfail; } sqlite3_free(sql); if (nrows == 1 && ncols == 1 && rows && rows[1]) { aBalance = strtol(rows[1], NULL, 0); } if (rows) { sqlite3_free_table(rows); } sql = sqlite3_mprintf("UPDATE tellers " "SET Tbalance = Tbalance + %d WHERE Tid = %d", delta, tid); rc = sqlite3_exec(sqlite, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { stat_counts[3] += 1; goto transfail; } sqlite3_free(sql); sql = sqlite3_mprintf("UPDATE branches " "SET Bbalance = Bbalance + %d WHERE Bid = %d", delta, bid); rc = sqlite3_exec(sqlite, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { stat_counts[4] += 1; goto transfail; } sqlite3_free(sql); sql = sqlite3_mprintf("INSERT INTO history" "(Tid, Bid, Aid, delta) VALUES" "(%d, %d, %d, %d)", tid, bid, aid, delta); rc = sqlite3_exec(sqlite, sql, NULL, NULL, NULL); if (rc != SQLITE_OK) { stat_counts[5] += 1; goto transfail; } sqlite3_free(sql); sql = 0; if (transactions) {try_commit: rc = sqlite3_exec(sqlite, "COMMIT TRANSACTION", NULL, NULL, NULL); if (rc == SQLITE_BUSY && --retries > 0) { stat_counts[9] += 1;#ifdef _WIN32 Sleep(10);#else usleep(10000);#endif goto try_commit; } if (rc != SQLITE_OK) { stat_counts[6] += 1; goto transfail; } } return;transfail: if (sql) { sqlite3_free(sql); sql = 0; } if (rc == SQLITE_BUSY && --retries > 0) { if (intrans) { sqlite3_exec(sqlite, "ROLLBACK TRANSACTION", NULL, NULL, NULL); stat_counts[7] += 1; } stat_counts[8] += 1;#ifdef _WIN32 Sleep(10);#else usleep(10000);#endif goto again; } incrementFailedTransactionCount(); if (intrans) { stat_counts[10] += 1; sqlite3_exec(sqlite, "ROLLBACK TRANSACTION", NULL, NULL, NULL); }}#ifdef _WIN32static unsigned __stdcall runClientThread(void *args)#elsestatic int runClientThread(void *args)#endif{ sqlite3 *sqlite; int ntrans = n_txn_per_client; if (sqlite3_open(dbname, &sqlite) != SQLITE_OK) { return 0; } sqlite3_busy_timeout(sqlite, 100000); while (ntrans-- > 0) { int account = getRandomID(ACCOUNT); int branch = getRandomID(BRANCH); int teller = getRandomID(TELLER); int delta = getRandomInt(0,1000); doOne(sqlite, branch, teller, account, delta); incrementTransactionCount(); } sqlite3_close(sqlite); return 0;}int main(int argc, char **argv){ int init_db = 0, i;#ifdef _WIN32 HANDLE *pids;#else pid_t *pids;#endif for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-clients") == 0) { if (i + 1 < argc) { i++; n_clients = strtol(argv[i], NULL, 0); } } else if (strcmp(argv[i], "-dbname") == 0) { if (i + 1 < argc) { i++; dbname = argv[i]; } } else if (strcmp(argv[i], "-tpc") == 0) { if (i + 1 < argc) { i++; n_txn_per_client = strtol(argv[i], NULL, 0); } } else if (strcmp(argv[i], "-init") == 0) { init_db = 1; } else if (strcmp(argv[i], "-tps") == 0) { if (i + 1 < argc) { i++; tps = strtol(argv[i], NULL, 0); } } else if (strcmp(argv[i], "-v") == 0) { verbose++; } else if (strcmp(argv[i], "-excl") == 0) { useexcl++; } } if (dbname == NULL) { fprintf(stderr, "usage: %s -dbame DBFILE [-v] [-init] " "[-tpc n] [-clients c] [-excl\n\n", argv[0]); fprintf(stderr, "-v verbose error messages\n"); fprintf(stderr, "-init initialize the tables\n"); fprintf(stderr, "-tpc transactions per client\n"); fprintf(stderr, "-clients number of simultaneous clients\n"); fprintf(stderr, "-excl use EXCLUSIVE transactions\n"); exit(1); } fprintf(stdout, "Scale factor value: %d\n", tps); fprintf(stdout, "Number of clients: %d\n", n_clients); fprintf(stdout, "Number of transactions per client: %d\n\n", n_txn_per_client); fflush(stdout); if (useexcl) { combegtrans = "COMMIT TRANSACTION ; BEGIN EXCLUSIVE TRANSACTION"; begtrans = "BEGIN EXCLUSIVE TRANSACTION"; } if (init_db) { fprintf(stdout, "Initializing dataset...\n"); createDatabase(); fprintf(stdout, "done.\n\n"); fflush(stdout); }#ifndef _WIN32 shmid = shmget(IPC_PRIVATE, 200 * sizeof (int), IPC_CREAT | 0666); shm = shmat(shmid, NULL, 0);#endif transaction_count = &shm[0]; failed_transactions = &shm[1]; stat_counts = &shm[2]; *transaction_count = 0; *failed_transactions = 0; memset(stat_counts, 0, 198 * sizeof (int));#ifdef _WIN32 pids = malloc(n_clients * sizeof (HANDLE));#else pids = malloc(n_clients * sizeof (pid_t));#endif if (pids == NULL) { fprintf(stderr, "malloc failed\n"); exit(2); } fprintf(stdout, "Starting Benchmark Run\n"); transactions = 0;#ifdef _WIN32 start_time = GetTickCount();#else gettimeofday(&start_time, NULL);#endif if (n_clients < 2) { runClientThread(NULL); } else {#ifdef _WIN32 for (i = 0; i < n_clients; i++) { unsigned tid; pids[i] = (HANDLE) _beginthreadex(NULL, 0, runClientThread, NULL, 0, &tid); } for (i = 0; i < n_clients; i++) { WaitForSingleObject(pids[i], INFINITE); CloseHandle(pids[i]); }#else for (i = 0; i < n_clients; i++) { pid_t child = fork(); int rc; switch (child) { case 0: rc = runClientThread(NULL); exit(rc); default: pids[i] = child; } } for (i = 0; i < n_clients; i++) { int status; waitpid(pids[i], &status, 0); }#endif } reportDone(); transactions = 1;#ifdef _WIN32 start_time = GetTickCount();#else gettimeofday(&start_time, NULL);#endif if (n_clients < 2) { runClientThread(NULL); } else {#ifdef _WIN32 for (i = 0; i < n_clients; i++) { unsigned tid; pids[i] = (HANDLE) _beginthreadex(NULL, 0,runClientThread, NULL, 0, &tid); } for (i = 0; i < n_clients; i++) { WaitForSingleObject(pids[i], INFINITE); CloseHandle(pids[i]); }#else for (i = 0; i < n_clients; i++) { pid_t child = fork(); int rc; switch (child) { case 0: rc = runClientThread(NULL); exit(rc); default: pids[i] = child; } } for (i = 0; i < n_clients; i++) { int status; waitpid(pids[i], &status, 0); }#endif } reportDone(); fprintf(stdout, "--------------------\n"); fprintf(stdout, "Error counters, consult source for stat_counts[].\n"); for (i = 0; i < 16; i++) { if (i == 0) { fprintf(stdout, "stat_counts[0..7]: "); } fprintf(stdout, " %d", stat_counts[i]); if (i == 7) { fprintf(stdout, "\nstat_counts[8..15]:"); } } fprintf(stdout, "\n\n"); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -