2007-11-29 14:27:03 +00:00
|
|
|
/* -*- mode: C; c-basic-offset: 4 -*- */
|
2008-01-24 15:10:32 +00:00
|
|
|
#ident "Copyright (c) 2007, 2008 Tokutek Inc. All rights reserved."
|
2007-11-29 14:27:03 +00:00
|
|
|
|
2007-09-19 18:55:08 +00:00
|
|
|
/* Insert a bunch of stuff */
|
2013-04-16 23:57:29 -04:00
|
|
|
#include <toku_portability.h>
|
2007-09-19 18:55:08 +00:00
|
|
|
#include <assert.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <db.h>
|
|
|
|
|
2008-02-28 13:14:50 +00:00
|
|
|
#if !defined(DB_YESOVERWRITE)
|
|
|
|
#define DB_YESOVERWRITE 0
|
|
|
|
#endif
|
|
|
|
|
2008-06-11 20:09:47 +00:00
|
|
|
#if !defined(DB_PRELOCKED_WRITE)
|
|
|
|
#define NO_DB_PRELOCKED
|
|
|
|
#define DB_PRELOCKED_WRITE 0
|
|
|
|
#endif
|
|
|
|
|
2008-05-13 02:35:50 +00:00
|
|
|
int verbose=1;
|
|
|
|
|
2007-09-19 18:55:08 +00:00
|
|
|
enum { SERIAL_SPACING = 1<<6 };
|
2008-02-29 20:49:18 +00:00
|
|
|
enum { DEFAULT_ITEMS_TO_INSERT_PER_ITERATION = 1<<20 };
|
|
|
|
enum { DEFAULT_ITEMS_PER_TRANSACTION = 1<<14 };
|
2007-09-19 18:55:08 +00:00
|
|
|
|
2007-10-01 19:55:37 +00:00
|
|
|
#define CKERR(r) if (r!=0) fprintf(stderr, "%s:%d error %d %s\n", __FILE__, __LINE__, r, db_strerror(r)); assert(r==0);
|
|
|
|
|
2007-11-14 17:49:48 +00:00
|
|
|
/* default test parameters */
|
|
|
|
int keysize = sizeof (long long);
|
|
|
|
int valsize = sizeof (long long);
|
|
|
|
int pagesize = 0;
|
|
|
|
long long cachesize = 128*1024*1024;
|
2008-02-28 13:14:50 +00:00
|
|
|
int dupflags = 0;
|
2008-02-29 20:49:18 +00:00
|
|
|
int noserial = 0; // Don't do the serial stuff
|
2008-03-01 15:32:38 +00:00
|
|
|
int norandom = 0; // Don't do the random stuff
|
2008-06-11 20:09:47 +00:00
|
|
|
int prelock = 0;
|
|
|
|
int prelockflag = 0;
|
2008-02-29 20:49:18 +00:00
|
|
|
int items_per_transaction = DEFAULT_ITEMS_PER_TRANSACTION;
|
|
|
|
int items_per_iteration = DEFAULT_ITEMS_TO_INSERT_PER_ITERATION;
|
2008-07-10 18:46:41 +00:00
|
|
|
int singlex = 0; // Do a single transaction
|
2008-04-20 11:14:05 +00:00
|
|
|
int do_transactions = 0;
|
2013-04-16 23:57:30 -04:00
|
|
|
int do_abort = 0;
|
2008-04-20 11:14:05 +00:00
|
|
|
int n_insertions_since_txn_began=0;
|
|
|
|
int env_open_flags = DB_CREATE|DB_PRIVATE|DB_INIT_MPOOL;
|
2008-06-11 20:09:47 +00:00
|
|
|
u_int32_t put_flags = DB_YESOVERWRITE;
|
2013-04-16 23:57:17 -04:00
|
|
|
double compressibility = -1; // -1 means make it very compressible. 1 means use random bits everywhere. 2 means half the bits are random.
|
2008-06-11 20:09:47 +00:00
|
|
|
|
|
|
|
static void do_prelock(DB* db, DB_TXN* txn) {
|
|
|
|
if (prelock) {
|
|
|
|
#if !defined(NO_DB_PRELOCKED)
|
|
|
|
int r = db->pre_acquire_table_lock(db, txn);
|
|
|
|
assert(r==0);
|
2013-04-16 23:57:31 -04:00
|
|
|
#else
|
|
|
|
db = db; txn = txn;
|
2008-06-11 20:09:47 +00:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
2007-10-01 21:19:53 +00:00
|
|
|
|
|
|
|
#define STRINGIFY2(s) #s
|
|
|
|
#define STRINGIFY(s) STRINGIFY2(s)
|
2013-04-16 23:57:28 -04:00
|
|
|
const char *dbdir = "./bench." STRINGIFY(DIRSUF); /* DIRSUF is passed in as a -D argument to the compiler. */
|
2007-09-19 18:55:08 +00:00
|
|
|
char *dbfilename = "bench.db";
|
|
|
|
char *dbname;
|
|
|
|
|
|
|
|
DB_ENV *dbenv;
|
|
|
|
DB *db;
|
2007-10-01 19:55:37 +00:00
|
|
|
DB_TXN *tid=0;
|
|
|
|
|
2007-09-19 18:55:08 +00:00
|
|
|
|
2013-04-16 23:57:28 -04:00
|
|
|
static void benchmark_setup (void) {
|
2007-09-19 18:55:08 +00:00
|
|
|
int r;
|
|
|
|
|
2007-10-01 21:19:53 +00:00
|
|
|
{
|
|
|
|
char unlink_cmd[strlen(dbdir) + strlen("rf -rf ") + 1];
|
|
|
|
snprintf(unlink_cmd, sizeof(unlink_cmd), "rm -rf %s", dbdir);
|
|
|
|
//printf("unlink_cmd=%s\n", unlink_cmd);
|
|
|
|
system(unlink_cmd);
|
|
|
|
}
|
2013-04-16 23:57:28 -04:00
|
|
|
if (strcmp(dbdir, ".") != 0) {
|
2013-04-16 23:57:28 -04:00
|
|
|
r = toku_os_mkdir(dbdir,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
|
2013-04-16 23:57:28 -04:00
|
|
|
assert(r == 0);
|
|
|
|
}
|
2007-09-19 18:55:08 +00:00
|
|
|
|
|
|
|
r = db_env_create(&dbenv, 0);
|
|
|
|
assert(r == 0);
|
|
|
|
|
2007-12-01 17:45:53 +00:00
|
|
|
#if DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR <= 4
|
2007-10-01 21:19:53 +00:00
|
|
|
if (dbenv->set_lk_max) {
|
2008-02-29 20:49:18 +00:00
|
|
|
r = dbenv->set_lk_max(dbenv, items_per_transaction*2);
|
2007-10-01 21:19:53 +00:00
|
|
|
assert(r==0);
|
|
|
|
}
|
2007-12-01 17:45:53 +00:00
|
|
|
#endif
|
2008-02-09 16:54:01 +00:00
|
|
|
if (dbenv->set_lk_max_locks) {
|
2008-02-29 20:49:18 +00:00
|
|
|
r = dbenv->set_lk_max_locks(dbenv, items_per_transaction*2);
|
2008-02-09 16:54:01 +00:00
|
|
|
assert(r == 0);
|
|
|
|
}
|
2007-10-01 21:19:53 +00:00
|
|
|
|
2007-09-19 18:55:08 +00:00
|
|
|
if (dbenv->set_cachesize) {
|
2007-11-14 17:49:48 +00:00
|
|
|
r = dbenv->set_cachesize(dbenv, cachesize / (1024*1024*1024), cachesize % (1024*1024*1024), 1);
|
2007-09-19 18:55:08 +00:00
|
|
|
if (r != 0)
|
|
|
|
printf("WARNING: set_cachesize %d\n", r);
|
|
|
|
}
|
|
|
|
|
2007-10-01 19:55:37 +00:00
|
|
|
{
|
2013-04-16 23:57:28 -04:00
|
|
|
r = dbenv->open(dbenv, dbdir, env_open_flags, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
|
2007-10-01 19:55:37 +00:00
|
|
|
assert(r == 0);
|
|
|
|
}
|
2007-09-19 18:55:08 +00:00
|
|
|
|
|
|
|
r = db_create(&db, dbenv, 0);
|
|
|
|
assert(r == 0);
|
|
|
|
|
2007-10-01 19:55:37 +00:00
|
|
|
if (do_transactions) {
|
2008-07-10 18:46:41 +00:00
|
|
|
r=dbenv->txn_begin(dbenv, 0, &tid, 0); CKERR(r);
|
|
|
|
if (singlex) do_prelock(db, tid);
|
2007-10-01 19:55:37 +00:00
|
|
|
}
|
2007-11-14 17:49:48 +00:00
|
|
|
if (pagesize && db->set_pagesize) {
|
|
|
|
r = db->set_pagesize(db, pagesize);
|
|
|
|
assert(r == 0);
|
|
|
|
}
|
2008-02-28 13:14:50 +00:00
|
|
|
if (dupflags) {
|
|
|
|
r = db->set_flags(db, dupflags);
|
|
|
|
assert(r == 0);
|
|
|
|
}
|
2013-04-16 23:57:28 -04:00
|
|
|
r = db->open(db, tid, dbfilename, NULL, DB_BTREE, DB_CREATE, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
|
2008-05-08 21:22:49 +00:00
|
|
|
if (r!=0) fprintf(stderr, "errno=%d, %s\n", errno, strerror(errno));
|
2007-09-19 18:55:08 +00:00
|
|
|
assert(r == 0);
|
2013-04-16 23:57:17 -04:00
|
|
|
if (do_transactions) {
|
2013-04-16 23:57:17 -04:00
|
|
|
if (singlex) do_prelock(db, tid);
|
|
|
|
else {
|
|
|
|
r=tid->commit(tid, 0);
|
|
|
|
assert(r==0);
|
|
|
|
}
|
2007-10-01 19:55:37 +00:00
|
|
|
}
|
|
|
|
|
2007-09-19 18:55:08 +00:00
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:28 -04:00
|
|
|
static void benchmark_shutdown (void) {
|
2007-09-19 18:55:08 +00:00
|
|
|
int r;
|
|
|
|
|
2008-07-10 18:46:41 +00:00
|
|
|
if (do_transactions && singlex) {
|
2013-04-16 23:57:30 -04:00
|
|
|
r = (do_abort ? tid->abort(tid) : tid->commit(tid, 0)); assert(r==0);
|
2008-07-10 18:46:41 +00:00
|
|
|
}
|
|
|
|
|
2007-09-19 18:55:08 +00:00
|
|
|
r = db->close(db, 0);
|
|
|
|
assert(r == 0);
|
|
|
|
r = dbenv->close(dbenv, 0);
|
|
|
|
assert(r == 0);
|
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static void long_long_to_array (unsigned char *a, int array_size, unsigned long long l) {
|
2007-09-19 18:55:08 +00:00
|
|
|
int i;
|
2013-04-16 23:57:17 -04:00
|
|
|
for (i=0; i<8 && i<array_size; i++)
|
2007-09-19 18:55:08 +00:00
|
|
|
a[i] = (l>>(56-8*i))&0xff;
|
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static DBT *fill_dbt(DBT *dbt, const void *data, int size) {
|
2007-09-19 18:55:08 +00:00
|
|
|
memset(dbt, 0, sizeof *dbt);
|
|
|
|
dbt->size = size;
|
2007-12-18 16:24:53 +00:00
|
|
|
dbt->data = (void *) data;
|
2007-09-19 18:55:08 +00:00
|
|
|
return dbt;
|
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:17 -04:00
|
|
|
// Fill array with 0's if compressibilty==-1, otherwise fill array with data that is likely to compress by a factor of compressibility.
|
2013-04-16 23:57:26 -04:00
|
|
|
static void fill_array (unsigned char *data, int size) {
|
2013-04-16 23:57:17 -04:00
|
|
|
memset(data, 0, size);
|
|
|
|
if (compressibility>0) {
|
|
|
|
int i;
|
|
|
|
for (i=0; i<size/compressibility; i++) {
|
2013-04-16 23:57:28 -04:00
|
|
|
data[i] = (unsigned char) random();
|
2013-04-16 23:57:17 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static void insert (long long v) {
|
2007-11-14 17:49:48 +00:00
|
|
|
unsigned char kc[keysize], vc[valsize];
|
2007-09-19 18:55:08 +00:00
|
|
|
DBT kt, vt;
|
2013-04-16 23:57:17 -04:00
|
|
|
fill_array(kc, sizeof kc);
|
|
|
|
long_long_to_array(kc, keysize, v); // Fill in the array first, then write the long long in.
|
|
|
|
fill_array(vc, sizeof vc);
|
|
|
|
long_long_to_array(vc, valsize, v);
|
2008-06-11 20:09:47 +00:00
|
|
|
int r = db->put(db, tid, fill_dbt(&kt, kc, keysize), fill_dbt(&vt, vc, valsize), put_flags);
|
2007-10-01 19:55:37 +00:00
|
|
|
CKERR(r);
|
2007-10-01 21:19:53 +00:00
|
|
|
if (do_transactions) {
|
2008-07-10 18:46:41 +00:00
|
|
|
if (n_insertions_since_txn_began>=items_per_transaction && !singlex) {
|
2007-10-01 21:19:53 +00:00
|
|
|
n_insertions_since_txn_began=0;
|
|
|
|
r = tid->commit(tid, 0); assert(r==0);
|
|
|
|
r=dbenv->txn_begin(dbenv, 0, &tid, 0); assert(r==0);
|
2008-06-11 20:09:47 +00:00
|
|
|
do_prelock(db, tid);
|
2007-10-01 21:19:53 +00:00
|
|
|
n_insertions_since_txn_began=0;
|
|
|
|
}
|
|
|
|
n_insertions_since_txn_began++;
|
|
|
|
}
|
2007-09-19 18:55:08 +00:00
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static void serial_insert_from (long long from) {
|
2007-09-19 18:55:08 +00:00
|
|
|
long long i;
|
2008-07-10 18:46:41 +00:00
|
|
|
if (do_transactions && !singlex) {
|
2007-10-01 19:55:37 +00:00
|
|
|
int r = dbenv->txn_begin(dbenv, 0, &tid, 0); assert(r==0);
|
2008-06-11 20:09:47 +00:00
|
|
|
do_prelock(db, tid);
|
2007-10-01 19:55:37 +00:00
|
|
|
{
|
|
|
|
DBT k,v;
|
2008-06-11 20:09:47 +00:00
|
|
|
r=db->put(db, tid, fill_dbt(&k, "a", 1), fill_dbt(&v, "b", 1), put_flags);
|
2007-10-01 19:55:37 +00:00
|
|
|
CKERR(r);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2008-02-29 20:49:18 +00:00
|
|
|
for (i=0; i<items_per_iteration; i++) {
|
2007-09-19 18:55:08 +00:00
|
|
|
insert((from+i)*SERIAL_SPACING);
|
|
|
|
}
|
2008-07-10 18:46:41 +00:00
|
|
|
if (do_transactions && !singlex) {
|
2007-10-01 19:55:37 +00:00
|
|
|
int r= tid->commit(tid, 0); assert(r==0);
|
|
|
|
tid=0;
|
|
|
|
}
|
2007-09-19 18:55:08 +00:00
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static long long llrandom (void) {
|
2007-09-19 18:55:08 +00:00
|
|
|
return (((long long)(random()))<<32) + random();
|
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static void random_insert_below (long long below) {
|
2007-09-19 18:55:08 +00:00
|
|
|
long long i;
|
2008-07-10 18:46:41 +00:00
|
|
|
if (do_transactions && !singlex) {
|
2007-10-01 19:55:37 +00:00
|
|
|
int r = dbenv->txn_begin(dbenv, 0, &tid, 0); assert(r==0);
|
2008-06-11 20:09:47 +00:00
|
|
|
do_prelock(db, tid);
|
2007-10-01 19:55:37 +00:00
|
|
|
}
|
2008-02-29 20:49:18 +00:00
|
|
|
for (i=0; i<items_per_iteration; i++) {
|
2007-09-19 18:55:08 +00:00
|
|
|
insert(llrandom()%below);
|
|
|
|
}
|
2008-07-10 18:46:41 +00:00
|
|
|
if (do_transactions && !singlex) {
|
2007-10-01 19:55:37 +00:00
|
|
|
int r= tid->commit(tid, 0); assert(r==0);
|
|
|
|
tid=0;
|
|
|
|
}
|
2007-09-19 18:55:08 +00:00
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static double tdiff (struct timeval *a, struct timeval *b) {
|
2007-09-19 18:55:08 +00:00
|
|
|
return (a->tv_sec-b->tv_sec)+1e-6*(a->tv_usec-b->tv_usec);
|
|
|
|
}
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static void biginsert (long long n_elements, struct timeval *starttime) {
|
2007-11-14 17:49:48 +00:00
|
|
|
long long i;
|
2007-09-19 18:55:08 +00:00
|
|
|
struct timeval t1,t2;
|
|
|
|
int iteration;
|
2008-02-29 20:49:18 +00:00
|
|
|
for (i=0, iteration=0; i<n_elements; i+=items_per_iteration, iteration++) {
|
|
|
|
if (!noserial) {
|
|
|
|
gettimeofday(&t1,0);
|
|
|
|
serial_insert_from(i);
|
|
|
|
gettimeofday(&t2,0);
|
2008-05-13 02:35:50 +00:00
|
|
|
if (verbose) printf("serial %9.6fs %8.0f/s ", tdiff(&t2, &t1), items_per_iteration/tdiff(&t2, &t1));
|
2008-02-29 20:49:18 +00:00
|
|
|
fflush(stdout);
|
|
|
|
}
|
2008-03-01 15:32:38 +00:00
|
|
|
if (!norandom) {
|
2007-09-19 18:55:08 +00:00
|
|
|
gettimeofday(&t1,0);
|
2008-02-29 20:49:18 +00:00
|
|
|
random_insert_below((i+items_per_iteration)*SERIAL_SPACING);
|
2007-09-19 18:55:08 +00:00
|
|
|
gettimeofday(&t2,0);
|
2008-05-13 02:35:50 +00:00
|
|
|
if (verbose) printf("random %9.6fs %8.0f/s ", tdiff(&t2, &t1), items_per_iteration/tdiff(&t2, &t1));
|
2008-03-01 15:32:38 +00:00
|
|
|
}
|
2008-05-13 02:35:50 +00:00
|
|
|
if (verbose) printf("cumulative %9.6fs %8.0f/s\n", tdiff(&t2, starttime), (((float)items_per_iteration*(!noserial+!norandom))/tdiff(&t2, starttime))*(iteration+1));
|
2007-09-19 18:55:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2007-10-01 19:55:37 +00:00
|
|
|
const long long default_n_items = 1LL<<22;
|
|
|
|
|
2013-04-16 23:57:26 -04:00
|
|
|
static int print_usage (const char *argv0) {
|
2007-10-01 19:55:37 +00:00
|
|
|
fprintf(stderr, "Usage:\n");
|
2013-04-16 23:57:17 -04:00
|
|
|
fprintf(stderr, " %s [-x] [--keysize KEYSIZE] [--valsize VALSIZE] [--noserial] [--norandom] [ n_iterations ]\n", argv0);
|
2007-10-01 19:55:37 +00:00
|
|
|
fprintf(stderr, " where\n");
|
2008-05-08 15:10:04 +00:00
|
|
|
fprintf(stderr, " -x do transactions (XCOUNT transactions per iteration) (default: no transactions at all)\n");
|
2007-11-14 17:49:48 +00:00
|
|
|
fprintf(stderr, " --keysize KEYSIZE sets the key size (default 8)\n");
|
|
|
|
fprintf(stderr, " --valsize VALSIZE sets the value size (default 8)\n");
|
2007-11-28 22:36:20 +00:00
|
|
|
fprintf(stderr, " --cachesize CACHESIZE set the database cache size\n");
|
|
|
|
fprintf(stderr, " --pagesize PAGESIZE sets the database page size\n");
|
2008-02-29 20:49:18 +00:00
|
|
|
fprintf(stderr, " --noserial causes the serial insertions to be skipped\n");
|
2013-04-16 23:57:17 -04:00
|
|
|
fprintf(stderr, " --norandom causes the random insertions to be skipped\n");
|
2013-04-16 23:57:17 -04:00
|
|
|
fprintf(stderr, " --compressibility C creates data that should compress by about a factor C. Default C is large. C is an float.\n");
|
2013-04-16 23:57:17 -04:00
|
|
|
fprintf(stderr, " --xcount N how many insertions per transaction (default=%d)\n", DEFAULT_ITEMS_PER_TRANSACTION);
|
|
|
|
fprintf(stderr, " --singlex Run the whole job as a single transaction. (Default don't run as a single transaction.)\n");
|
2013-04-16 23:57:30 -04:00
|
|
|
fprintf(stderr, " --abort Abort the singlex after the transaction is over. (Requires --singlex.)\n");
|
2013-04-16 23:57:17 -04:00
|
|
|
fprintf(stderr, " --periter N how many insertions per iteration (default=%d)\n", DEFAULT_ITEMS_TO_INSERT_PER_ITERATION);
|
|
|
|
fprintf(stderr, " --DB_INIT_TXN (1|0) turn on or off the DB_INIT_TXN env_open_flag\n");
|
|
|
|
fprintf(stderr, " --DB_INIT_LOG (1|0) turn on or off the DB_INIT_LOG env_open_flag\n");
|
|
|
|
fprintf(stderr, " --DB_INIT_LOCK (1|0) turn on or off the DB_INIT_LOCK env_open_flag\n");
|
2008-05-08 21:22:49 +00:00
|
|
|
fprintf(stderr, " --env DIR\n");
|
2008-02-29 20:49:18 +00:00
|
|
|
fprintf(stderr, " n_iterations how many iterations (default %lld)\n", default_n_items/DEFAULT_ITEMS_TO_INSERT_PER_ITERATION);
|
2007-10-01 19:55:37 +00:00
|
|
|
|
2008-02-28 13:14:50 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2007-10-01 19:55:37 +00:00
|
|
|
|
|
|
|
int main (int argc, const char *argv[]) {
|
2007-09-19 18:55:08 +00:00
|
|
|
struct timeval t1,t2,t3;
|
2007-10-01 19:55:37 +00:00
|
|
|
long long total_n_items = default_n_items;
|
2007-11-14 17:49:48 +00:00
|
|
|
int i;
|
|
|
|
for (i=1; i<argc; i++) {
|
|
|
|
const char *arg = argv[i];
|
|
|
|
if (arg[0] != '-')
|
|
|
|
break;
|
2008-05-13 02:35:50 +00:00
|
|
|
if (strcmp(arg, "-q") == 0) {
|
|
|
|
verbose--; if (verbose<0) verbose=0;
|
|
|
|
} else if (strcmp(arg, "-x") == 0) {
|
2007-11-14 17:49:48 +00:00
|
|
|
do_transactions = 1;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--DB_INIT_TXN") == 0) {
|
2008-04-20 11:14:05 +00:00
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
|
|
|
if (atoi(argv[++i]))
|
|
|
|
env_open_flags |= DB_INIT_TXN;
|
|
|
|
else
|
|
|
|
env_open_flags &= ~DB_INIT_TXN;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--DB_INIT_LOG") == 0) {
|
2008-04-20 11:14:05 +00:00
|
|
|
if (atoi(argv[++i]))
|
|
|
|
env_open_flags |= DB_INIT_LOG;
|
|
|
|
else
|
|
|
|
env_open_flags &= ~DB_INIT_LOG;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--DB_INIT_LOCK") == 0) {
|
2008-04-20 11:14:05 +00:00
|
|
|
if (atoi(argv[++i]))
|
|
|
|
env_open_flags |= DB_INIT_LOCK;
|
|
|
|
else
|
|
|
|
env_open_flags &= ~DB_INIT_LOCK;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--noserial") == 0) {
|
2008-02-29 20:49:18 +00:00
|
|
|
noserial=1;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--norandom") == 0) {
|
2008-03-01 15:32:38 +00:00
|
|
|
norandom=1;
|
2013-04-16 23:57:17 -04:00
|
|
|
} else if (strcmp(arg, "--compressibility") == 0) {
|
2013-04-16 23:57:17 -04:00
|
|
|
compressibility = atof(argv[++i]);
|
2008-07-10 18:46:41 +00:00
|
|
|
} else if (strcmp(arg, "--singlex") == 0) {
|
|
|
|
do_transactions = 1;
|
|
|
|
singlex = 1;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--xcount") == 0) {
|
2008-02-29 20:49:18 +00:00
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
|
|
|
items_per_transaction = strtoll(argv[++i], 0, 10);
|
2013-04-16 23:57:30 -04:00
|
|
|
} else if (strcmp(arg, "--abort") == 0) {
|
|
|
|
do_abort = 1;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--periter") == 0) {
|
2008-02-29 20:49:18 +00:00
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
|
|
|
items_per_iteration = strtoll(argv[++i], 0, 10);
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--cachesize") == 0) {
|
2008-02-28 13:14:50 +00:00
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
|
|
|
cachesize = strtoll(argv[++i], 0, 10);
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--keysize") == 0) {
|
2008-02-28 13:14:50 +00:00
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
|
|
|
keysize = atoi(argv[++i]);
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--valsize") == 0) {
|
2008-02-28 13:14:50 +00:00
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
|
|
|
valsize = atoi(argv[++i]);
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--pagesize") == 0) {
|
2008-02-28 13:14:50 +00:00
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
2008-04-20 11:14:05 +00:00
|
|
|
pagesize = atoi(argv[++i]);
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--dupsort") == 0) {
|
2008-02-28 13:14:50 +00:00
|
|
|
dupflags = DB_DUP + DB_DUPSORT;
|
2007-11-14 17:49:48 +00:00
|
|
|
continue;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else if (strcmp(arg, "--env") == 0) {
|
|
|
|
if (i+1 >= argc) return print_usage(argv[0]);
|
|
|
|
dbdir = argv[++i];
|
2008-06-11 20:09:47 +00:00
|
|
|
} else if (strcmp(arg, "--prelock") == 0) {
|
|
|
|
prelock=1;
|
|
|
|
} else if (strcmp(arg, "--prelockflag") == 0) {
|
|
|
|
prelock=1;
|
|
|
|
prelockflag=1;
|
2008-05-08 21:22:49 +00:00
|
|
|
} else {
|
|
|
|
return print_usage(argv[0]);
|
|
|
|
}
|
2007-11-14 17:49:48 +00:00
|
|
|
}
|
2008-07-10 18:46:41 +00:00
|
|
|
if (do_transactions) {
|
|
|
|
env_open_flags |= DB_INIT_TXN | DB_INIT_LOG | DB_INIT_LOCK;
|
|
|
|
}
|
2008-06-11 20:09:47 +00:00
|
|
|
if (do_transactions && prelockflag) {
|
|
|
|
put_flags |= DB_PRELOCKED_WRITE;
|
|
|
|
}
|
2007-11-14 17:49:48 +00:00
|
|
|
if (i<argc) {
|
|
|
|
/* if it looks like a number */
|
|
|
|
char *end;
|
|
|
|
errno=0;
|
|
|
|
long n_iterations = strtol(argv[i], &end, 10);
|
|
|
|
if (errno!=0 || *end!=0 || end==argv[i]) {
|
|
|
|
print_usage(argv[0]);
|
|
|
|
return 1;
|
|
|
|
}
|
2008-02-29 20:49:18 +00:00
|
|
|
total_n_items = items_per_iteration * (long long)n_iterations;
|
2007-09-19 18:55:08 +00:00
|
|
|
}
|
2008-05-13 02:35:50 +00:00
|
|
|
if (verbose) {
|
|
|
|
if (!noserial) printf("serial ");
|
|
|
|
if (!noserial && !norandom) printf("and ");
|
|
|
|
if (!norandom) printf("random ");
|
|
|
|
printf("insertions of %d per batch%s\n", items_per_iteration, do_transactions ? " (with transactions)" : "");
|
|
|
|
}
|
2013-04-16 23:57:28 -04:00
|
|
|
benchmark_setup();
|
2007-09-19 18:55:08 +00:00
|
|
|
gettimeofday(&t1,0);
|
|
|
|
biginsert(total_n_items, &t1);
|
|
|
|
gettimeofday(&t2,0);
|
2013-04-16 23:57:28 -04:00
|
|
|
benchmark_shutdown();
|
2007-09-19 18:55:08 +00:00
|
|
|
gettimeofday(&t3,0);
|
2008-05-13 02:35:50 +00:00
|
|
|
if (verbose) {
|
|
|
|
printf("Shutdown %9.6fs\n", tdiff(&t3, &t2));
|
|
|
|
printf("Total time %9.6fs for %lld insertions = %8.0f/s\n", tdiff(&t3, &t1),
|
|
|
|
(!noserial+!norandom)*total_n_items, (!noserial+!norandom)*total_n_items/tdiff(&t3, &t1));
|
|
|
|
}
|
2013-04-16 23:57:26 -04:00
|
|
|
#if 0 && defined TOKUDB
|
2008-05-27 21:08:31 +00:00
|
|
|
if (verbose) {
|
|
|
|
extern unsigned long toku_get_maxrss(void);
|
|
|
|
printf("maxrss=%.2fMB\n", toku_get_maxrss()/256.0);
|
|
|
|
}
|
2008-06-14 01:38:53 +00:00
|
|
|
if (0) {
|
|
|
|
extern void print_hash_histogram (void) __attribute__((__visibility__("default")));
|
|
|
|
print_hash_histogram();
|
|
|
|
}
|
2008-05-27 21:08:31 +00:00
|
|
|
#endif
|
2007-09-19 18:55:08 +00:00
|
|
|
return 0;
|
|
|
|
}
|