/* -*- mode: C; c-basic-offset: 4 -*- */ #ident "Copyright (c) 2007 Tokutek Inc. All rights reserved." /* Insert a bunch of stuff */ #include #include #include #include #include #include #include #include #include enum { SERIAL_SPACING = 1<<6 }; enum { ITEMS_TO_INSERT_PER_ITERATION = 1<<20 }; enum { ITEMS_PER_TRANSACTION = 1<<14 }; //enum { ITEMS_TO_INSERT_PER_ITERATION = 1<<14 }; enum { BOUND_INCREASE_PER_ITERATION = SERIAL_SPACING*ITEMS_TO_INSERT_PER_ITERATION }; #define CKERR(r) if (r!=0) fprintf(stderr, "%s:%d error %d %s\n", __FILE__, __LINE__, r, db_strerror(r)); assert(r==0); int verbose = 1; /* default test parameters */ int keysize = sizeof (long long); int valsize = sizeof (long long); int pagesize = 0; long long cachesize = 128*1024*1024; #define STRINGIFY2(s) #s #define STRINGIFY(s) STRINGIFY2(s) char dbdir[] = "./bench." STRINGIFY(DIRSUF) "/"; /* DIRSUF is passed in as a -D argument to the compiler. */; char dbfilename[] = "bench.db"; char *dbname; DbEnv *dbenv; Db *db; DbTxn *tid=0; int do_transactions = 0; int n_insertions_since_txn_began=0; void setup (void) { int r; { 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); } if (strcmp(dbdir, ".") != 0) mkdir(dbdir, 0755); dbenv = new DbEnv(DB_CXX_NO_EXCEPTIONS); assert(dbenv); #if DB_VERSION_MAJOR<4 || (DB_VERSION_MAJOR==4 && DB_VERSION_MINOR<=4) { r = dbenv->set_lk_max(ITEMS_PER_TRANSACTION*2); assert(r==0); } #endif r = dbenv->set_lk_max_locks(ITEMS_PER_TRANSACTION*2); assert(r == 0); if (cachesize) { r = dbenv->set_cachesize(cachesize / (1024*1024*1024), cachesize % (1024*1024*1024), 1); if (r != 0) printf("WARNING: set_cachesize %d\n", r); } { int flags = DB_CREATE|DB_PRIVATE|DB_INIT_MPOOL | (do_transactions ? (DB_INIT_TXN | DB_INIT_LOG | DB_INIT_LOCK): 0); r = dbenv->open(dbdir, flags, 0644); assert(r == 0); } db = new Db(dbenv, DB_CXX_NO_EXCEPTIONS); assert(db); if (do_transactions) { r=dbenv->txn_begin(0, &tid, 0); assert(r==0); } if (pagesize) { r = db->set_pagesize(pagesize); assert(r == 0); } r = db->open(tid, dbfilename, NULL, DB_BTREE, DB_CREATE, 0644); assert(r == 0); if (do_transactions) { r=tid->commit(0); assert(r==0); } } void shutdown (void) { int r; r = db->close(0); assert(r == 0); delete db; r = dbenv->close(0); assert(r == 0); delete dbenv; } void long_long_to_array (unsigned char *a, unsigned long long l) { int i; for (i=0; i<8; i++) a[i] = (l>>(56-8*i))&0xff; } DBT *toku_fill_dbt(DBT *dbt, const void *data, int size) { memset(dbt, 0, sizeof *dbt); dbt->size = size; dbt->data = (void *) data; return dbt; } void insert (long long v) { unsigned char kc[keysize], vc[valsize]; Dbt kt(kc, keysize), vt(vc, valsize); memset(kc, 0, sizeof kc); long_long_to_array(kc, v); memset(vc, 0, sizeof vc); long_long_to_array(vc, v); int r = db->put(tid, &kt, &vt, 0); CKERR(r); if (do_transactions) { if (n_insertions_since_txn_began>=ITEMS_PER_TRANSACTION) { n_insertions_since_txn_began=0; r = tid->commit(0); assert(r==0); r=dbenv->txn_begin(0, &tid, 0); assert(r==0); n_insertions_since_txn_began=0; } n_insertions_since_txn_began++; } } void serial_insert_from (long long from) { long long i; if (do_transactions) { int r = dbenv->txn_begin(0, &tid, 0); assert(r==0); #if 0 { DBT k,v; r=db->put(db, tid, toku_fill_dbt(&k, "a", 1), toku_fill_dbt(&v, "b", 1), 0); CKERR(r); } #endif } for (i=0; icommit(0); assert(r==0); tid=0; } } long long llrandom (void) { return (((long long)(random()))<<32) + random(); } void random_insert_below (long long below) { long long i; if (do_transactions) { int r = dbenv->txn_begin(0, &tid, 0); assert(r==0); } for (i=0; icommit(0); assert(r==0); tid=0; } } double tdiff (struct timeval *a, struct timeval *b) { return (a->tv_sec-b->tv_sec)+1e-6*(a->tv_usec-b->tv_usec); } void biginsert (long long n_elements, struct timeval *starttime) { long long i; struct timeval t1,t2; int iteration; for (i=0, iteration=0; i