2013-04-17 00:00:59 -04:00
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
# ident "$Id$"
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>
2013-04-16 23:59:06 -04:00
# include "tokudb_common_funcs.h"
2013-04-16 23:57:48 -04:00
# include <toku_time.h>
2013-04-16 23:58:56 -04:00
# include <toku_assert.h>
2007-09-19 18:55:08 +00:00
# include <errno.h>
# include <string.h>
# include <stdio.h>
# include <stdlib.h>
# include <sys/stat.h>
# include <unistd.h>
2013-04-17 00:00:25 -04:00
# if defined(HAVE_MALLOC_H)
# include <malloc.h>
# elif defined(HAVE_SYS_MALLOC_H)
# include <sys / malloc.h>
# endif
# include <dlfcn.h>
2007-09-19 18:55:08 +00:00
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 ;
2013-04-16 23:59:56 -04:00
int engine_status = 0 ;
2013-04-16 23:58:58 -04:00
int which ;
2008-05-13 02:35:50 +00:00
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 } ;
2013-04-17 00:00:02 -04:00
# define DEFAULT_N_ITEMS (1LL<<22)
# define DEFAULT_N_ITERATIONS (DEFAULT_N_ITEMS / DEFAULT_ITEMS_TO_INSERT_PER_ITERATION)
2007-09-19 18:55:08 +00:00
2013-04-16 23:57:46 -04:00
static void insert ( long long v ) ;
2013-04-17 00:00:14 -04:00
# define CKERR(r) ({ int __r = r; if (__r!=0) fprintf(stderr, "%s:%d error %d %s\n", __FILE__, __LINE__, __r, db_strerror(r)); assert(__r==0); })
2013-04-16 23:59:38 -04:00
# define CKERR2(r,rexpect) do { if (r!=rexpect) fprintf(stderr, "%s:%d error %d %s\n", __FILE__, __LINE__, r, db_strerror(r)); assert(r==rexpect); } while (0)
2007-10-01 19:55:37 +00:00
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 ;
2013-04-16 23:57:42 -04:00
int do_1514_point_query = 0 ;
2008-02-28 13:14:50 +00:00
int dupflags = 0 ;
2013-04-16 23:58:58 -04:00
int insert_multiple = 0 ;
int num_dbs = 1 ;
2013-04-16 23:59:55 -04:00
int cleaner_period = 0 ;
int cleaner_iterations = 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 ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
int finish_child_first = 0 ; // Commit or abort child first (before doing so to the parent). No effect if child does not exist.
int singlex_child = 0 ; // Do a single transaction, but do all work with a child
2008-07-10 18:46:41 +00:00
int singlex = 0 ; // Do a single transaction
2013-04-16 23:57:53 -04:00
int singlex_create = 0 ; // Create the db using the single transaction (only valid if singlex)
2013-04-16 23:57:46 -04:00
int insert1first = 0 ; // insert 1 before doing the rest
2013-04-16 23:59:05 -04:00
int check_small_rollback = 0 ; // verify that the rollback logs are small (only valid if singlex)
2008-04-20 11:14:05 +00:00
int do_transactions = 0 ;
2013-04-16 23:57:33 -04:00
int if_transactions_do_logging = DB_INIT_LOG ; // set this to zero if we want no logging when transactions are used
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 ;
2013-04-17 00:01:01 -04:00
uint32_t put_flags = 0 ;
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.
2013-04-16 23:57:46 -04:00
int do_append = 0 ;
2013-04-16 23:57:50 -04:00
int do_checkpoint_period = 0 ;
2013-04-17 00:01:01 -04:00
uint32_t checkpoint_period = 0 ;
2013-04-16 23:58:04 -04:00
static const char * log_dir = NULL ;
2013-04-16 23:58:04 -04:00
static int commitflags = 0 ;
2013-04-16 23:59:04 -04:00
static int redzone = 0 ;
static int redzone_set = 0 ;
2013-04-16 23:59:23 -04:00
static int do_optimize = 0 ;
2013-04-16 23:59:38 -04:00
static int unique_checks = 0 ;
2013-04-17 00:00:02 -04:00
static long long n_iterations = DEFAULT_N_ITERATIONS ;
2008-06-11 20:09:47 +00:00
2013-04-16 23:58:52 -04:00
static int use_random = 0 ;
enum { MAX_RANDOM_C = 16000057 } ; // prime-numbers.org
static unsigned char random_c [ MAX_RANDOM_C ] ;
static int next_random_c ;
static void init_random_c ( void ) {
int i ;
for ( i = 0 ; i < MAX_RANDOM_C ; i + + )
random_c [ i ] = ( unsigned char ) random ( ) ;
}
static void update_random_c_index ( int n ) {
next_random_c + = n ;
if ( next_random_c > = MAX_RANDOM_C )
next_random_c = 0 ;
}
static unsigned char get_random_c ( void ) {
update_random_c_index ( 1 ) ;
return random_c [ next_random_c ] ;
}
2013-04-16 23:58:56 -04:00
static int min_int ( int a , int b ) {
2013-04-16 23:58:52 -04:00
return a > b ? b : a ;
}
static void copy_random_c ( unsigned char * p , int n ) {
while ( n > 0 ) {
2013-04-16 23:58:56 -04:00
int m = min_int ( n , MAX_RANDOM_C - next_random_c ) ;
2013-04-16 23:58:52 -04:00
memcpy ( p , & random_c [ next_random_c ] , m ) ;
n - = m ;
p + = m ;
update_random_c_index ( m ) ;
}
}
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
2013-04-17 00:01:09 -04:00
( void ) db ; ( void ) 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. */
2013-04-17 00:00:58 -04:00
const char * dbfilename = " bench.db " ;
2007-09-19 18:55:08 +00:00
char * dbname ;
DB_ENV * dbenv ;
2013-04-16 23:58:58 -04:00
enum { MAX_DBS = 128 } ;
DB * dbs [ MAX_DBS ] ;
uint32_t put_flagss [ MAX_DBS ] ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
DB_TXN * parenttid = 0 ;
2007-10-01 19:55:37 +00:00
DB_TXN * tid = 0 ;
2013-04-16 23:58:59 -04:00
DBT dest_keys [ MAX_DBS ] ;
DBT dest_vals [ MAX_DBS ] ;
2007-10-01 19:55:37 +00:00
2013-04-16 23:58:58 -04:00
# if defined(TOKUDB)
static int
2013-04-16 23:59:30 -04:00
put_multiple_generate ( DB * dest_db , DB * src_db , DBT * dest_key , DBT * dest_val , const DBT * src_key , const DBT * src_val ) {
2013-04-16 23:58:59 -04:00
assert ( src_db = = NULL ) ;
assert ( dest_db ! = NULL ) ;
2013-04-16 23:58:58 -04:00
2013-04-16 23:58:59 -04:00
dest_key - > data = src_key - > data ;
dest_key - > size = src_key - > size ;
dest_val - > data = src_val - > data ;
dest_val - > size = src_val - > size ;
2013-04-16 23:58:58 -04:00
return 0 ;
}
# endif
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 ;
2013-04-16 23:57:46 -04:00
if ( ! do_append ) {
2013-04-16 23:57:38 -04:00
char unlink_cmd [ strlen ( dbdir ) + strlen ( " rm -rf " ) + 1 ] ;
2007-10-01 21:19:53 +00:00
snprintf ( unlink_cmd , sizeof ( unlink_cmd ) , " rm -rf %s " , dbdir ) ;
//printf("unlink_cmd=%s\n", unlink_cmd);
2013-04-16 23:59:07 -04:00
r = system ( unlink_cmd ) ;
CKERR ( r ) ;
2013-04-16 23:57:46 -04:00
if ( strcmp ( dbdir , " . " ) ! = 0 ) {
r = toku_os_mkdir ( dbdir , S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH ) ;
assert ( r = = 0 ) ;
}
2013-04-16 23:57:28 -04:00
}
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
2013-04-17 00:01:15 -04:00
# ifndef TOKUDB
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 ) ;
}
2013-04-17 00:01:15 -04:00
# endif
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 ) ;
}
2013-04-16 23:58:04 -04:00
if ( log_dir ) {
r = dbenv - > set_lg_dir ( dbenv , log_dir ) ;
assert ( r = = 0 ) ;
2007-10-01 19:55:37 +00:00
}
2013-04-16 23:58:58 -04:00
# if defined(TOKUDB)
if ( insert_multiple ) {
2013-04-16 23:58:59 -04:00
r = dbenv - > set_generate_row_callback_for_put ( dbenv , put_multiple_generate ) ;
2013-04-16 23:58:58 -04:00
CKERR ( r ) ;
}
# endif
2007-09-19 18:55:08 +00:00
2013-04-16 23:59:04 -04:00
# if defined(TOKUDB)
if ( redzone_set ) {
r = dbenv - > set_redzone ( dbenv , redzone ) ;
assert ( r = = 0 ) ;
}
# endif
2013-04-16 23:58:04 -04:00
r = dbenv - > open ( dbenv , dbdir , env_open_flags , S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ) ;
assert ( r = = 0 ) ;
2013-04-16 23:57:52 -04:00
# if defined(TOKUDB)
2013-04-16 23:57:50 -04:00
if ( do_checkpoint_period ) {
r = dbenv - > checkpointing_set_period ( dbenv , checkpoint_period ) ;
assert ( r = = 0 ) ;
2013-04-17 00:01:01 -04:00
uint32_t period ;
2013-04-16 23:57:50 -04:00
r = dbenv - > checkpointing_get_period ( dbenv , & period ) ;
assert ( r = = 0 & & period = = checkpoint_period ) ;
}
# endif
2013-04-16 23:59:55 -04:00
# if defined(TOKUDB)
if ( cleaner_period ) {
r = dbenv - > cleaner_set_period ( dbenv , cleaner_period ) ;
assert ( r = = 0 ) ;
2013-04-17 00:01:01 -04:00
uint32_t period ;
2013-04-16 23:59:55 -04:00
r = dbenv - > cleaner_get_period ( dbenv , & period ) ;
2013-04-17 00:01:01 -04:00
assert ( r = = 0 & & period = = ( uint32_t ) cleaner_period ) ;
2013-04-16 23:59:55 -04:00
}
if ( cleaner_iterations ) {
r = dbenv - > cleaner_set_iterations ( dbenv , cleaner_iterations ) ;
assert ( r = = 0 ) ;
2013-04-17 00:01:01 -04:00
uint32_t iterations ;
2013-04-16 23:59:55 -04:00
r = dbenv - > cleaner_get_iterations ( dbenv , & iterations ) ;
2013-04-17 00:01:01 -04:00
assert ( r = = 0 & & iterations = = ( uint32_t ) cleaner_iterations ) ;
2013-04-16 23:59:55 -04:00
}
# endif
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
r = db_create ( & dbs [ which ] , dbenv , 0 ) ;
assert ( r = = 0 ) ;
}
2007-09-19 18:55:08 +00:00
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 ) ;
2007-10-01 19:55:37 +00:00
}
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
if ( pagesize & & db - > set_pagesize ) {
r = db - > set_pagesize ( db , pagesize ) ;
assert ( r = = 0 ) ;
}
if ( dupflags ) {
r = db - > set_flags ( db , dupflags ) ;
assert ( r = = 0 ) ;
}
char name [ strlen ( dbfilename ) + 10 ] ;
if ( which = = 0 )
sprintf ( name , " %s " , dbfilename ) ;
else
sprintf ( name , " %s_%d " , dbfilename , which ) ;
r = db - > open ( db , tid , name , NULL , DB_BTREE , DB_CREATE , S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ) ;
if ( r ! = 0 ) fprintf ( stderr , " errno=%d, %s \n " , errno , strerror ( errno ) ) ;
2008-02-28 13:14:50 +00:00
assert ( r = = 0 ) ;
}
2013-04-16 23:57:46 -04:00
if ( insert1first ) {
if ( do_transactions ) {
r = tid - > commit ( tid , 0 ) ;
assert ( r = = 0 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
tid = NULL ;
2013-04-16 23:57:46 -04:00
r = dbenv - > txn_begin ( dbenv , 0 , & tid , 0 ) ; CKERR ( r ) ;
}
insert ( - 1 ) ;
if ( singlex ) {
r = tid - > commit ( tid , 0 ) ;
assert ( r = = 0 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
tid = NULL ;
2013-04-16 23:57:46 -04:00
r = dbenv - > txn_begin ( dbenv , 0 , & tid , 0 ) ; CKERR ( r ) ;
}
}
2013-04-16 23:57:53 -04:00
else if ( singlex & & ! singlex_create ) {
r = tid - > commit ( tid , 0 ) ;
assert ( r = = 0 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
tid = NULL ;
2013-04-16 23:57:53 -04:00
r = dbenv - > txn_begin ( dbenv , 0 , & tid , 0 ) ; CKERR ( r ) ;
}
2013-04-16 23:57:17 -04:00
if ( do_transactions ) {
2013-04-16 23:58:58 -04:00
if ( singlex ) {
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
do_prelock ( db , tid ) ;
}
}
2013-04-16 23:57:17 -04:00
else {
r = tid - > commit ( tid , 0 ) ;
assert ( r = = 0 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
tid = NULL ;
2013-04-16 23:57:17 -04:00
}
2007-10-01 19:55:37 +00:00
}
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
if ( singlex_child ) {
parenttid = tid ;
tid = NULL ;
r = dbenv - > txn_begin ( dbenv , parenttid , & tid , 0 ) ; CKERR ( r ) ;
}
2007-10-01 19:55:37 +00:00
2007-09-19 18:55:08 +00:00
}
2013-04-16 23:57:42 -04:00
# if defined(TOKUDB)
2013-04-16 23:57:42 -04:00
static void test1514 ( void ) ;
2013-04-16 23:57:42 -04:00
# endif
2013-04-16 23:57:28 -04:00
static void benchmark_shutdown ( void ) {
2007-09-19 18:55:08 +00:00
int r ;
2013-04-16 23:57:42 -04:00
# if defined(TOKUDB)
2013-04-16 23:57:42 -04:00
if ( do_1514_point_query ) test1514 ( ) ;
2013-04-16 23:57:42 -04:00
# endif
2013-04-16 23:57:53 -04:00
if ( do_transactions & & singlex & & ! insert1first & & ( singlex_create | | prelock ) ) {
2013-04-16 23:57:38 -04:00
# if defined(TOKUDB)
2013-04-16 23:59:05 -04:00
//There should be a single 'truncate' in the rollback instead of many 'insert' entries.
2013-04-16 23:57:38 -04:00
struct txn_stat * s ;
r = tid - > txn_stat ( tid , & s ) ;
assert ( r = = 0 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
//TODO: #1125 Always do the test after performance testing is done.
2013-04-16 23:59:05 -04:00
if ( singlex_child ) fprintf ( stderr , " SKIPPED 'small rollback' test for child txn \n " ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
else
2013-04-16 23:59:05 -04:00
assert ( s - > rollback_raw_count < 100 ) ; // gross test, not worth investigating details
2013-04-16 23:59:40 -04:00
toku_free ( s ) ;
2013-04-16 23:57:38 -04:00
//system("ls -l bench.tokudb");
# endif
2008-07-10 18:46:41 +00:00
}
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
if ( do_transactions & & singlex ) {
if ( ! singlex_child | | finish_child_first ) {
assert ( tid ) ;
r = ( do_abort ? tid - > abort ( tid ) : tid - > commit ( tid , 0 ) ) ; assert ( r = = 0 ) ;
tid = NULL ;
}
if ( singlex_child ) {
2013-04-16 23:57:57 -04:00
tid = NULL ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
assert ( parenttid ) ;
r = ( do_abort ? parenttid - > abort ( parenttid ) : parenttid - > commit ( parenttid , 0 ) ) ; assert ( r = = 0 ) ;
parenttid = NULL ;
}
else
assert ( ! parenttid ) ;
}
assert ( ! tid ) ;
assert ( ! parenttid ) ;
2008-07-10 18:46:41 +00:00
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
2013-04-16 23:59:23 -04:00
if ( do_optimize ) {
# if defined(TOKUDB)
r = db - > optimize ( db ) ;
assert ( r = = 0 ) ;
# endif
}
2013-04-16 23:58:58 -04:00
r = db - > close ( db , 0 ) ;
assert ( r = = 0 ) ;
}
2013-04-16 23:59:57 -04:00
if ( engine_status ) {
2013-04-16 23:59:56 -04:00
print_engine_status ( dbenv ) ;
2013-04-17 00:00:25 -04:00
typedef void ( * malloc_stats_fun_t ) ( void ) ;
malloc_stats_fun_t malloc_stats_f = ( malloc_stats_fun_t ) dlsym ( RTLD_DEFAULT , " malloc_stats " ) ;
if ( malloc_stats_f ) {
malloc_stats_f ( ) ;
}
2013-04-16 23:59:57 -04:00
}
2007-09-19 18:55:08 +00:00
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 ) {
2013-04-16 23:58:52 -04:00
if ( use_random ) {
int i ;
for ( i = 0 ; i < size / compressibility ; i + + ) {
data [ i ] = ( unsigned char ) random ( ) ;
}
} else {
copy_random_c ( data , size / compressibility ) ;
}
2013-04-16 23:57:17 -04:00
}
}
2013-04-16 23:57:26 -04:00
static void insert ( long long v ) {
2013-04-16 23:58:58 -04:00
int r ;
2013-04-17 00:00:58 -04:00
unsigned char * XMALLOC_N ( keysize , kc ) ;
unsigned char * XMALLOC_N ( valsize , vc ) ;
2007-09-19 18:55:08 +00:00
DBT kt , vt ;
2013-04-16 23:58:58 -04:00
fill_array ( kc , keysize ) ;
2013-04-16 23:57:17 -04:00
long_long_to_array ( kc , keysize , v ) ; // Fill in the array first, then write the long long in.
2013-04-16 23:58:58 -04:00
fill_array ( vc , valsize ) ;
2013-04-16 23:57:17 -04:00
long_long_to_array ( vc , valsize , v ) ;
2013-04-16 23:58:59 -04:00
fill_dbt ( & kt , kc , keysize ) ;
fill_dbt ( & vt , vc , valsize ) ;
2013-04-16 23:58:58 -04:00
if ( insert_multiple ) {
# if defined(TOKUDB)
2013-04-16 23:59:30 -04:00
r = dbenv - > put_multiple ( dbenv , NULL , tid , & kt , & vt , num_dbs , dbs , dest_keys , dest_vals , put_flagss ) ;
2013-04-16 23:58:58 -04:00
# else
r = EINVAL ;
# endif
2013-04-16 23:59:38 -04:00
if ( unique_checks )
assert ( r = = 0 | | r = = DB_KEYEXIST ) ;
else
CKERR ( r ) ;
2013-04-16 23:58:58 -04:00
}
else {
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
2013-04-16 23:58:59 -04:00
r = db - > put ( db , tid , & kt , & vt , put_flags ) ;
2013-04-16 23:59:38 -04:00
if ( unique_checks )
assert ( r = = 0 | | r = = DB_KEYEXIST ) ;
else
CKERR ( r ) ;
2013-04-16 23:58:58 -04:00
}
}
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 ;
2013-04-16 23:58:04 -04:00
r = tid - > commit ( tid , commitflags ) ; assert ( r = = 0 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
tid = NULL ;
2007-10-01 21:19:53 +00:00
r = dbenv - > txn_begin ( dbenv , 0 , & tid , 0 ) ; assert ( r = = 0 ) ;
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
do_prelock ( db , tid ) ;
}
2007-10-01 21:19:53 +00:00
n_insertions_since_txn_began = 0 ;
}
n_insertions_since_txn_began + + ;
}
2013-04-17 00:00:02 -04:00
toku_free ( kc ) ;
toku_free ( vc ) ;
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 ) ;
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
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 ( ( 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 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
tid = NULL ;
2007-10-01 19:55:37 +00:00
}
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 ) ;
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
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 ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
tid = NULL ;
2007-10-01 19:55:37 +00:00
}
2007-09-19 18:55:08 +00:00
}
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 + + ) {
2013-04-16 23:59:37 -04:00
if ( verbose ) printf ( " %3d " , iteration ) ;
2008-02-29 20:49:18 +00:00
if ( ! noserial ) {
gettimeofday ( & t1 , 0 ) ;
serial_insert_from ( i ) ;
gettimeofday ( & t2 , 0 ) ;
2013-04-16 23:57:48 -04:00
if ( verbose ) printf ( " serial %9.6fs %8.0f/s " , toku_tdiff ( & t2 , & t1 ) , items_per_iteration / toku_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 ) ;
2013-04-16 23:57:48 -04:00
if ( verbose ) printf ( " random %9.6fs %8.0f/s " , toku_tdiff ( & t2 , & t1 ) , items_per_iteration / toku_tdiff ( & t2 , & t1 ) ) ;
2008-03-01 15:32:38 +00:00
}
2013-04-16 23:59:37 -04:00
if ( verbose ) printf ( " cumulative %10.6fs %8.0f/s \n " , toku_tdiff ( & t2 , starttime ) , ( ( ( float ) items_per_iteration * ( ! noserial + ! norandom ) ) / toku_tdiff ( & t2 , starttime ) ) * ( iteration + 1 ) ) ;
2007-09-19 18:55:08 +00:00
}
}
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 ) ;
2013-04-16 23:58:04 -04:00
fprintf ( stderr , " --nosync commit with nosync \n " ) ;
2013-04-16 23:57:53 -04:00
fprintf ( stderr , " --singlex (implies -x) Run the whole job as a single transaction. (Default don't run as a single transaction.) \n " ) ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
fprintf ( stderr , " --singlex-child (implies -x) Run the whole job as a single transaction, do all work a child of that transaction. \n " ) ;
fprintf ( stderr , " --finish-child-first Commit/abort child before doing so to parent (no effect if no child). \n " ) ;
2013-04-16 23:57:53 -04:00
fprintf ( stderr , " --singlex-create (implies --singlex) Create the file using the single transaction (Default is to use a different transaction to create.) \n " ) ;
2013-04-16 23:59:05 -04:00
fprintf ( stderr , " --check_small_rollback (Only valid in --singlex mode) Verify that very little data was saved in the rollback logs. \n " ) ;
2013-04-16 23:57:35 -04:00
fprintf ( stderr , " --prelock Prelock the database. \n " ) ;
fprintf ( stderr , " --prelockflag Prelock the database and send the DB_PRELOCKED_WRITE flag. \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:33 -04:00
fprintf ( stderr , " --nolog If transactions are used, then don't write the recovery log \n " ) ;
2013-04-16 23:58:04 -04:00
fprintf ( stderr , " --log_dir LOGDIR Put the logs in LOGDIR \n " ) ;
fprintf ( stderr , " --env DIR \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 ) ;
2013-04-16 23:57:42 -04:00
fprintf ( stderr , " --1514 do a point query for something not there at end. See #1514. (Requires --norandom) \n " ) ;
2013-04-16 23:57:46 -04:00
fprintf ( stderr , " --append append to an existing file \n " ) ;
2013-04-16 23:58:52 -04:00
fprintf ( stderr , " --userandom use random() \n " ) ;
2013-04-17 00:00:58 -04:00
fprintf ( stderr , " --checkpoint-period % " PRIu32 " checkpoint period \n " , checkpoint_period ) ;
fprintf ( stderr , " --cleaner-period % " PRIu32 " cleaner period \n " , cleaner_period ) ;
fprintf ( stderr , " --cleaner-iterations % " PRIu32 " cleaner iterations \n " , cleaner_iterations ) ;
2013-04-16 23:58:58 -04:00
fprintf ( stderr , " --numdbs N Insert same items into N dbs (1 to %d) \n " , MAX_DBS ) ;
fprintf ( stderr , " --insertmultiple Use DB_ENV->put_multiple api. Requires transactions. \n " ) ;
2013-04-16 23:59:04 -04:00
fprintf ( stderr , " --redzone N redzone in percent \n " ) ;
2013-04-16 23:59:05 -04:00
fprintf ( stderr , " --srandom N srandom(N) \n " ) ;
2013-04-16 23:59:56 -04:00
fprintf ( stderr , " --engine_status print engine status at end of test \n " ) ;
2013-04-17 00:00:02 -04:00
fprintf ( stderr , " n_iterations how many iterations (default %lld) \n " , DEFAULT_N_ITERATIONS ) ;
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
2013-04-16 23:57:42 -04:00
# if defined(TOKUDB)
2013-04-16 23:57:42 -04:00
static int
nothing ( DBT const * UU ( key ) , DBT const * UU ( val ) , void * UU ( extra ) ) {
return 0 ;
}
static void
test1514 ( void ) {
assert ( norandom ) ; //Otherwise we can't know the given element is missing.
unsigned char kc [ keysize ] , vc [ valsize ] ;
DBT kt ;
long long v = SERIAL_SPACING - 1 ;
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 ) ;
int r ;
DBC * c ;
struct timeval t1 , t2 ;
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
DB * db = dbs [ which ] ;
r = db - > cursor ( db , tid , & c , 0 ) ; CKERR ( r ) ;
gettimeofday ( & t1 , 0 ) ;
r = c - > c_getf_set ( c , 0 , fill_dbt ( & kt , kc , keysize ) , nothing , NULL ) ;
gettimeofday ( & t2 , 0 ) ;
CKERR2 ( r , DB_NOTFOUND ) ;
r = c - > c_close ( c ) ; CKERR ( r ) ;
}
2013-04-16 23:57:42 -04:00
2013-04-16 23:57:48 -04:00
if ( verbose ) printf ( " (#1514) Single Point Query %9.6fs \n " , toku_tdiff ( & t2 , & t1 ) ) ;
2013-04-16 23:57:42 -04:00
}
2013-04-16 23:57:42 -04:00
# endif
2013-04-16 23:57:42 -04:00
2013-04-16 23:59:06 -04:00
static int test_main ( int argc , char * const argv [ ] ) {
2007-09-19 18:55:08 +00:00
struct timeval t1 , t2 , t3 ;
2013-04-17 00:00:02 -04:00
long long total_n_items = DEFAULT_N_ITEMS ;
2013-04-16 23:57:50 -04:00
char * endptr ;
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 , " --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:58:58 -04:00
} else if ( strcmp ( arg , " --insertmultiple " ) = = 0 ) {
insert_multiple = 1 ;
} else if ( strcmp ( arg , " --numdbs " ) = = 0 ) {
num_dbs = atoi ( argv [ + + i ] ) ;
if ( num_dbs < = 0 | | num_dbs > MAX_DBS ) {
fprintf ( stderr , " --numdbs needs between 1 and %d \n " , MAX_DBS ) ;
return print_usage ( argv [ 0 ] ) ;
}
2013-04-16 23:59:55 -04:00
} else if ( strcmp ( arg , " --cleaner-period " ) = = 0 ) {
cleaner_period = atoi ( argv [ + + i ] ) ;
if ( cleaner_period < 0 ) {
fprintf ( stderr , " --cleaner-period needs to be positive \n " ) ;
return print_usage ( argv [ 0 ] ) ;
}
} else if ( strcmp ( arg , " --cleaner-iterations " ) = = 0 ) {
cleaner_iterations = atoi ( argv [ + + i ] ) ;
if ( cleaner_iterations < 0 ) {
fprintf ( stderr , " --cleaner-iterations needs to be positive \n " ) ;
return print_usage ( argv [ 0 ] ) ;
}
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 ] ) ;
2013-04-16 23:58:52 -04:00
init_random_c ( ) ; ( void ) get_random_c ( ) ;
2013-04-16 23:57:33 -04:00
} else if ( strcmp ( arg , " --nolog " ) = = 0 ) {
if_transactions_do_logging = 0 ;
2013-04-16 23:57:53 -04:00
} else if ( strcmp ( arg , " --singlex-create " ) = = 0 ) {
do_transactions = 1 ;
singlex = 1 ;
singlex_create = 1 ;
Addresses #1125 Merged nested transactions from temporary merge branch into main.
Current tests fail (not regressions, they fail as of 13461)
* {{{x1.tdbrun}}}
* {{{test_log(2,3,4,5,6,7,8,9,10).recover}}}
* {{{test-recover(1,2,3).tdbrun}}}
* {{{test1324.tdbrun}}}
ULE_DEBUG disabled (defined to 0) Can be re-enabled for test purposes (set to 1).
refs [t:1125]
Merging into the temp branch (tokudb.main_13461+1125)
{{{svn merge --accept=postpone -r 12527:13461 ../tokudb.1125 ./}}}
Merging into main
{{{svn merge --accept=postpone -r13462:13463 ../tokudb.main_13461+1125/ ./}}}
git-svn-id: file:///svn/toku/tokudb@13464 c7de825b-a66e-492c-adef-691d508d4ae1
2013-04-16 23:57:56 -04:00
} else if ( strcmp ( arg , " --finish-child-first " ) = = 0 ) {
finish_child_first = 1 ;
} else if ( strcmp ( arg , " --singlex-child " ) = = 0 ) {
do_transactions = 1 ;
singlex = 1 ;
singlex_child = 1 ;
2008-07-10 18:46:41 +00:00
} else if ( strcmp ( arg , " --singlex " ) = = 0 ) {
do_transactions = 1 ;
singlex = 1 ;
2013-04-16 23:57:46 -04:00
} else if ( strcmp ( arg , " --insert1first " ) = = 0 ) {
insert1first = 1 ;
2013-04-16 23:59:05 -04:00
} else if ( strcmp ( arg , " --check_small_rollback " ) = = 0 ) {
check_small_rollback = 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 ] ) ;
2013-04-16 23:57:50 -04:00
items_per_transaction = strtoll ( argv [ + + i ] , & endptr , 10 ) ; assert ( * endptr = = 0 ) ;
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 ] ) ;
2013-04-16 23:57:50 -04:00
items_per_iteration = strtoll ( argv [ + + i ] , & endptr , 10 ) ; assert ( * endptr = = 0 ) ;
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 ] ) ;
2013-04-16 23:57:50 -04:00
cachesize = strtoll ( argv [ + + i ] , & endptr , 10 ) ; assert ( * endptr = = 0 ) ;
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 , " --env " ) = = 0 ) {
if ( i + 1 > = argc ) return print_usage ( argv [ 0 ] ) ;
dbdir = argv [ + + i ] ;
2013-04-16 23:57:42 -04:00
# if defined(TOKUDB)
2013-04-16 23:57:42 -04:00
} else if ( strcmp ( arg , " --1514 " ) = = 0 ) {
do_1514_point_query = 1 ;
2013-04-16 23:57:42 -04:00
# endif
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 ;
2013-04-16 23:57:46 -04:00
} else if ( strcmp ( arg , " --srandom " ) = = 0 ) {
if ( i + 1 > = argc ) return print_usage ( argv [ 0 ] ) ;
srandom ( atoi ( argv [ + + i ] ) ) ;
} else if ( strcmp ( arg , " --append " ) = = 0 ) {
do_append = 1 ;
2013-04-16 23:57:50 -04:00
} else if ( strcmp ( arg , " --checkpoint-period " ) = = 0 ) {
if ( i + 1 > = argc ) return print_usage ( argv [ 9 ] ) ;
do_checkpoint_period = 1 ;
2013-04-17 00:01:01 -04:00
checkpoint_period = ( uint32_t ) atoi ( argv [ + + i ] ) ;
2013-04-16 23:58:04 -04:00
} else if ( strcmp ( arg , " --nosync " ) = = 0 ) {
commitflags + = DB_TXN_NOSYNC ;
2013-04-16 23:58:52 -04:00
} else if ( strcmp ( arg , " --userandom " ) = = 0 ) {
use_random = 1 ;
} else if ( strcmp ( arg , " --unique_checks " ) = = 0 ) {
if ( i + 1 > = argc ) return print_usage ( argv [ 0 ] ) ;
2013-04-16 23:59:38 -04:00
unique_checks = atoi ( argv [ + + i ] ) ;
2013-04-16 23:58:52 -04:00
if ( unique_checks )
put_flags = DB_NOOVERWRITE ;
else
2013-04-16 23:59:40 -04:00
put_flags = 0 ;
2013-04-16 23:58:52 -04:00
} else if ( strcmp ( arg , " --log_dir " ) = = 0 ) {
if ( i + 1 > = argc ) return print_usage ( argv [ 0 ] ) ;
log_dir = argv [ + + i ] ;
2013-04-16 23:59:04 -04:00
} else if ( strcmp ( arg , " --redzone " ) = = 0 ) {
if ( i + 1 > = argc ) return print_usage ( argv [ 0 ] ) ;
redzone_set = 1 ;
redzone = atoi ( argv [ + + i ] ) ;
2013-04-16 23:59:23 -04:00
} else if ( strcmp ( arg , " --optimize " ) = = 0 ) {
do_optimize = 1 ;
2013-04-16 23:59:56 -04:00
} else if ( strcmp ( arg , " --engine_status " ) = = 0 ) {
engine_status = 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 ) {
2013-04-16 23:57:33 -04:00
env_open_flags | = DB_INIT_TXN | if_transactions_do_logging | DB_INIT_LOCK ;
2008-07-10 18:46:41 +00:00
}
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 ;
2013-04-17 00:00:02 -04:00
n_iterations = strtol ( argv [ i ] , & end , 10 ) ;
2007-11-14 17:49:48 +00:00
if ( errno ! = 0 | | * end ! = 0 | | end = = argv [ i ] ) {
print_usage ( argv [ 0 ] ) ;
return 1 ;
}
2013-04-17 00:00:02 -04:00
total_n_items = items_per_iteration * n_iterations ;
2013-04-16 23:59:37 -04:00
i + + ;
}
if ( i < argc ) {
fprintf ( stderr , " Extra arguments? \n " ) ;
print_usage ( argv [ 0 ] ) ;
return 1 ;
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:38 -04:00
# if !defined TOKUDB
2013-04-16 23:58:58 -04:00
if ( insert_multiple ) {
fprintf ( stderr , " --insert_multiple only works on the TokuDB (not BDB) \n " ) ;
return print_usage ( argv [ 0 ] ) ;
}
2013-04-16 23:59:05 -04:00
if ( check_small_rollback ) {
fprintf ( stderr , " --check_small_rollback only works on the TokuDB (not BDB) \n " ) ;
2013-04-16 23:57:38 -04:00
return print_usage ( argv [ 0 ] ) ;
}
# endif
2013-04-16 23:58:58 -04:00
if ( insert_multiple ) {
2013-04-16 23:58:59 -04:00
memset ( dest_keys , 0 , sizeof ( dest_keys ) ) ;
memset ( dest_vals , 0 , sizeof ( dest_vals ) ) ;
2013-04-16 23:58:58 -04:00
for ( which = 0 ; which < num_dbs ; which + + ) {
put_flagss [ i ] = put_flags ;
}
}
2013-04-16 23:59:05 -04:00
if ( check_small_rollback & & ! singlex ) {
fprintf ( stderr , " --check_small_rollback requires --singlex \n " ) ;
2013-04-16 23:57:38 -04:00
return print_usage ( argv [ 0 ] ) ;
}
2013-04-16 23:58:58 -04:00
if ( ! do_transactions & & insert_multiple ) {
fprintf ( stderr , " --insert_multiple requires transactions \n " ) ;
return print_usage ( argv [ 0 ] ) ;
}
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 ) {
2013-04-16 23:57:48 -04:00
printf ( " Shutdown %9.6fs \n " , toku_tdiff ( & t3 , & t2 ) ) ;
printf ( " Total time %9.6fs for %lld insertions = %8.0f/s \n " , toku_tdiff ( & t3 , & t1 ) ,
( ! noserial + ! norandom ) * total_n_items , ( ! noserial + ! norandom ) * total_n_items / toku_tdiff ( & t3 , & t1 ) ) ;
2008-05-13 02:35:50 +00:00
}
2007-09-19 18:55:08 +00:00
return 0 ;
}