/* -*- mode: C; c-basic-offset: 4 -*- */ #ident "Copyright (c) 2010 Tokutek Inc. All rights reserved." #ident "$Id: loader-stress-test.c 20470 2010-05-20 18:30:04Z bkuszmaul $" #define kv_pair_funcs 1 // pull in kv_pair generators from test.h #include "test.h" #include "toku_pthread.h" #include "toku_atomic.h" #include <db.h> #include <sys/stat.h> #include "ydb-internal.h" #include "test_kv_gen.h" /* */ DB_ENV *env; enum {MAX_NAME=128}; int NUM_DBS=5; int NUM_ROWS=100000; int SRC_VERSION = 4; int littlenode = 0; int flat = 0; char *env_dir = ENVDIR; // the default env_dir. char *db_v5_dir = "dir.preload-db.c.tdb"; char *db_v4_dir = "env_preload.4.1.1.cleanshutdown"; char *db_v4_dir_node4k = "env_preload.4.1.1.node4k.cleanshutdown"; char *db_v4_dir_flat = "env_preload.4.1.1.flat.cleanshutdown"; static void upgrade_test_1(DB **dbs) { int r; // open the DBS { DBT desc; dbt_init(&desc, "foo", sizeof("foo")); char name[MAX_NAME*2]; int idx[MAX_DBS]; for(int i=0;i<NUM_DBS;i++) { idx[i] = i; r = db_create(&dbs[i], env, 0); CKERR(r); r = dbs[i]->set_descriptor(dbs[i], 1, &desc); CKERR(r); dbs[i]->app_private = &idx[i]; snprintf(name, sizeof(name), "db_%04x", i); r = dbs[i]->open(dbs[i], NULL, name, NULL, DB_BTREE, DB_CREATE, 0666); CKERR(r); } } // read and verify all rows { if ( verbose ) {printf("checking");fflush(stdout);} check_results(env, dbs, NUM_DBS, NUM_ROWS); if ( verbose) {printf("\ndone\n");fflush(stdout);} } // close { for(int i=0;i<NUM_DBS;i++) { dbs[i]->close(dbs[i], 0); CKERR(r); dbs[i] = NULL; } } } static void setup(void) { int r; int len = 256; char syscmd[len]; char * src_db_dir; if ( SRC_VERSION == 4 ) { if (flat) src_db_dir = db_v4_dir_flat; else if (littlenode) src_db_dir = db_v4_dir_node4k; else src_db_dir = db_v4_dir; } else if ( SRC_VERSION == 5 ) { src_db_dir = db_v5_dir; } else { fprintf(stderr, "unsupported TokuDB version %d to upgrade\n", SRC_VERSION); assert(0); } r = snprintf(syscmd, len, "rm -rf %s", env_dir); assert(r<len); r = system(syscmd); CKERR(r); r = snprintf(syscmd, len, "cp -r %s %s", src_db_dir, env_dir); assert(r<len); r = system(syscmd); CKERR(r); generate_permute_tables(); } static void run_test(void) { int r; r = db_env_create(&env, 0); CKERR(r); if (littlenode) { r = env->set_cachesize(env, 0, 512*1024, 1); CKERR(r); } r = env->set_redzone(env, 0); CKERR(r); int envflags = DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_CREATE | DB_PRIVATE; r = env->open(env, env_dir, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r); env->set_errfile(env, stderr); r = env->checkpointing_set_period(env, 1); CKERR(r); DB **dbs = (DB**)toku_malloc(sizeof(DB*) * NUM_DBS); assert(dbs != NULL); // -------------------------- upgrade_test_1(dbs); // -------------------------- if (verbose >= 2) print_engine_status(env); r = env->close(env, 0); CKERR(r); toku_free(dbs); } // ------------ infrastructure ---------- static void do_args(int argc, char * const argv[]); int test_main(int argc, char * const *argv) { do_args(argc, argv); if (SRC_VERSION == 4) { littlenode = 1; // 4k nodes, small cache } setup(); run_test(); // read, upgrade, write back to disk run_test(); // read and verify return 0; } static void do_args(int argc, char * const argv[]) { int resultcode; char *cmd = argv[0]; argc--; argv++; while (argc>0) { if (strcmp(argv[0], "-v")==0) { verbose++; } else if (strcmp(argv[0],"-q")==0) { verbose--; if (verbose<0) verbose=0; } else if (strcmp(argv[0], "-h")==0) { resultcode=0; do_usage: fprintf(stderr, "Usage: -h -d <num_dbs> -r <num_rows> %s\n", cmd); exit(resultcode); } else if (strcmp(argv[0], "-d")==0) { argc--; argv++; NUM_DBS = atoi(argv[0]); if ( NUM_DBS > MAX_DBS ) { fprintf(stderr, "max value for -d field is %d\n", MAX_DBS); resultcode=1; goto do_usage; } } else if (strcmp(argv[0], "-r")==0) { argc--; argv++; NUM_ROWS = atoi(argv[0]); } else if (strcmp(argv[0], "-V")==0) { argc--; argv++; SRC_VERSION = atoi(argv[0]); } else if (strcmp(argv[0], "-f")==0) { flat = 1; } else { fprintf(stderr, "Unknown arg: %s\n", argv[0]); resultcode=1; goto do_usage; } argc--; argv++; } }