Commit 71d07a25 authored by Barry Perlman's avatar Barry Perlman Committed by Yoni Fogel

[t:2892] Add function to check rows, but skipping over first n rows which are...

[t:2892] Add function to check rows, but skipping over first n rows which are expected to have been deleted.

git-svn-id: file:///svn/toku/tokudb@26137 c7de825b-a66e-492c-adef-691d508d4ae1
parent 30296c52
...@@ -84,9 +84,11 @@ pkey_for_val(int key, int i) { ...@@ -84,9 +84,11 @@ pkey_for_val(int key, int i) {
return rotr32(key, i) - MAGIC; return rotr32(key, i) - MAGIC;
} }
// don't check first n rows (expect to have been deleted)
static void UU() static void UU()
check_results(DB_ENV *env, DB **dbs, const int num_dbs, const int num_rows) check_results_after_row_n(DB_ENV *env, DB **dbs, const int num_dbs, const int num_rows, const int first_row_to_check) {
{
for(int j=0;j<num_dbs;j++){ for(int j=0;j<num_dbs;j++){
DBT key, val; DBT key, val;
unsigned int k=0, v=0; unsigned int k=0, v=0;
...@@ -102,7 +104,7 @@ check_results(DB_ENV *env, DB **dbs, const int num_dbs, const int num_rows) ...@@ -102,7 +104,7 @@ check_results(DB_ENV *env, DB **dbs, const int num_dbs, const int num_rows)
DBC *cursor; DBC *cursor;
r = dbs[j]->cursor(dbs[j], txn, &cursor, 0); r = dbs[j]->cursor(dbs[j], txn, &cursor, 0);
CKERR(r); CKERR(r);
for(int i=0;i<num_rows;i++) { for(int i=first_row_to_check; i<num_rows; i++) {
r = cursor->c_get(cursor, &key, &val, DB_NEXT); r = cursor->c_get(cursor, &key, &val, DB_NEXT);
CKERR(r); CKERR(r);
k = *(unsigned int*)key.data; k = *(unsigned int*)key.data;
...@@ -124,6 +126,13 @@ check_results(DB_ENV *env, DB **dbs, const int num_dbs, const int num_rows) ...@@ -124,6 +126,13 @@ check_results(DB_ENV *env, DB **dbs, const int num_dbs, const int num_rows)
if ( verbose ) {printf("ok");fflush(stdout);} if ( verbose ) {printf("ok");fflush(stdout);}
} }
static void UU()
check_results(DB_ENV *env, DB **dbs, const int num_dbs, const int num_rows)
{
check_results_after_row_n(env, dbs, num_dbs, num_rows, 0);
}
static int UU() static int UU()
put_multiple_generate(DB *dest_db, DB *src_db, DBT *dest_key, DBT *dest_val, const DBT *src_key, const DBT *src_val, void *extra) { put_multiple_generate(DB *dest_db, DB *src_db, DBT *dest_key, DBT *dest_val, const DBT *src_key, const DBT *src_val, void *extra) {
......
...@@ -12,6 +12,10 @@ ...@@ -12,6 +12,10 @@
#include "test_kv_gen.h" #include "test_kv_gen.h"
/**************************************************************************************** /****************************************************************************************
*
* Test sequence is run four times, two in outer loop, two in inner loop
* Outer loop is for default or small node and cachetable sizes,
* inner loop is for insert and delete.
* *
* open dbs * open dbs
* read and verify first n rows of primary, a few interspersed rows of secondaries (n is very small so only a few nodes of secondaries are upgraded, even with prefetch) * read and verify first n rows of primary, a few interspersed rows of secondaries (n is very small so only a few nodes of secondaries are upgraded, even with prefetch)
...@@ -20,7 +24,10 @@ ...@@ -20,7 +24,10 @@
* read and verify a few more rows of primary, a few more interspersed rows of secondaries * read and verify a few more rows of primary, a few more interspersed rows of secondaries
* close dbs (some more nodes now upgraded) * close dbs (some more nodes now upgraded)
* open dbs * open dbs
* insert more rows (at end of primary and interspersed in secondary dictionaries) * if (insert test)
* insert at end of primary and interspersed in secondary dictionaries
* else (delete test)
* delete from beginning of primary and interspersed in secondary dictionaries
* close dbs * close dbs
* open dbs * open dbs
* verify all rows (including newly inserted ones) * verify all rows (including newly inserted ones)
...@@ -48,6 +55,8 @@ enum {ROWS_PER_TRANSACTION=10000}; ...@@ -48,6 +55,8 @@ enum {ROWS_PER_TRANSACTION=10000};
static int idx[MAX_DBS]; static int idx[MAX_DBS];
typedef enum {insert, delete} test_type;
static void static void
open_dbs(DB **dbs) { open_dbs(DB **dbs) {
int r; int r;
...@@ -75,9 +84,16 @@ close_dbs(DB **dbs) { ...@@ -75,9 +84,16 @@ close_dbs(DB **dbs) {
} }
static void upgrade_test_4(DB **dbs) { static void upgrade_test_4(DB **dbs, test_type test_to_do) {
int r; int r;
int n = 4; // number of rows to check to partially upgrade dictionary int n = 4; // number of rows to check to partially upgrade dictionary
char * msg;
if (test_to_do == insert)
msg = "insert";
else if (test_to_do == delete)
msg = "delete";
else assert(0);
// open the DBS // open the DBS
open_dbs(dbs); open_dbs(dbs);
...@@ -86,7 +102,7 @@ static void upgrade_test_4(DB **dbs) { ...@@ -86,7 +102,7 @@ static void upgrade_test_4(DB **dbs) {
{ {
check_results(env, dbs, NUM_DBS, n); check_results(env, dbs, NUM_DBS, n);
if (verbose) if (verbose)
printf("First %d rows checked, now insert some more\n", n); printf("First %d rows checked, now close and reopen\n", n);
} }
// close and reopen // close and reopen
...@@ -98,14 +114,14 @@ static void upgrade_test_4(DB **dbs) { ...@@ -98,14 +114,14 @@ static void upgrade_test_4(DB **dbs) {
n *= 2; n *= 2;
check_results(env, dbs, NUM_DBS, n); check_results(env, dbs, NUM_DBS, n);
if (verbose) if (verbose)
printf("First %d rows checked, now insert some more\n", n); printf("\nFirst %d rows checked, now %s some rows\n", n, msg);
} }
// close and reopen // close and reopen
close_dbs(dbs); close_dbs(dbs);
open_dbs(dbs); open_dbs(dbs);
// append some rows // insert or delete some rows
DB_TXN *txn; DB_TXN *txn;
DBT skey, sval; DBT skey, sval;
DBT key, val; DBT key, val;
...@@ -113,12 +129,25 @@ static void upgrade_test_4(DB **dbs) { ...@@ -113,12 +129,25 @@ static void upgrade_test_4(DB **dbs) {
dbt_init_realloc(&val); dbt_init_realloc(&val);
unsigned int k, v; unsigned int k, v;
if ( verbose ) { printf("appending");fflush(stdout); } if ( verbose ) {
int outer_loop_num = ( NUM_ROWS <= ROWS_PER_TRANSACTION ) ? 1 : (NUM_ROWS / ROWS_PER_TRANSACTION); printf("%s some rows\n", msg);
fflush(stdout);
}
int num_rows_to_modify, base;
if (test_to_do == insert) {
num_rows_to_modify = NUM_ROWS;
base = NUM_ROWS; // insert after existing rows in primary
}
else if (test_to_do == delete) {
num_rows_to_modify = 2*n;
base = 0; // delete some rows from primary
}
else assert(0);
int outer_loop_num = ( num_rows_to_modify <= ROWS_PER_TRANSACTION ) ? 1 : (num_rows_to_modify / ROWS_PER_TRANSACTION);
for(int x=0;x<outer_loop_num;x++) { for(int x=0;x<outer_loop_num;x++) {
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r); r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
for(int i=1;i<=ROWS_PER_TRANSACTION;i++) { for(int i=1; (i<=ROWS_PER_TRANSACTION && i<=num_rows_to_modify); i++) {
k = i + (x*ROWS_PER_TRANSACTION) + NUM_ROWS; k = i + (x*ROWS_PER_TRANSACTION) + base;
v = generate_val(k, 0); v = generate_val(k, 0);
dbt_init(&skey, &k, sizeof(unsigned int)); dbt_init(&skey, &k, sizeof(unsigned int));
dbt_init(&sval, &v, sizeof(unsigned int)); dbt_init(&sval, &v, sizeof(unsigned int));
...@@ -129,8 +158,16 @@ static void upgrade_test_4(DB **dbs) { ...@@ -129,8 +158,16 @@ static void upgrade_test_4(DB **dbs) {
&key, &val, // &key, &val, //
&skey, &sval, // src_key, src_val &skey, &sval, // src_key, src_val
NULL); // extra, ignored NULL); // extra, ignored
if (test_to_do == insert) {
r = dbs[db]->put(dbs[db], txn, &key, &val, 0);
CKERR(r);
}
else if (test_to_do == delete) {
r = dbs[db]->del(dbs[db], txn, &key, 0);
CKERR(r);
}
else assert(0);
r = dbs[db]->put(dbs[db], txn, &key, &val, 0); CKERR(r);
if (key.flags == 0) { dbt_init_realloc(&key); } if (key.flags == 0) { dbt_init_realloc(&key); }
if (val.flags == 0) { dbt_init_realloc(&val); } if (val.flags == 0) { dbt_init_realloc(&val); }
} }
...@@ -150,7 +187,11 @@ static void upgrade_test_4(DB **dbs) { ...@@ -150,7 +187,11 @@ static void upgrade_test_4(DB **dbs) {
// read and verify all rows // read and verify all rows
{ {
if ( verbose ) {printf("\nchecking");fflush(stdout);} if ( verbose ) {printf("\nchecking");fflush(stdout);}
check_results(env, dbs, NUM_DBS, NUM_ROWS * 2); if (test_to_do == insert)
check_results(env, dbs, NUM_DBS, NUM_ROWS * 2);
else if (test_to_do == delete)
check_results_after_row_n(env, dbs, NUM_DBS, NUM_ROWS, num_rows_to_modify);
else assert(0);
if ( verbose) {printf("\ndone\n");fflush(stdout);} if ( verbose) {printf("\ndone\n");fflush(stdout);}
} }
// close // close
...@@ -195,7 +236,7 @@ static void setup(void) { ...@@ -195,7 +236,7 @@ static void setup(void) {
} }
static void run_test(void) static void run_test(test_type test_to_do)
{ {
int r; int r;
...@@ -207,13 +248,13 @@ static void run_test(void) ...@@ -207,13 +248,13 @@ static void run_test(void)
int envflags = DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_CREATE | DB_PRIVATE; 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); r = env->open(env, env_dir, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
env->set_errfile(env, stderr); env->set_errfile(env, stderr);
r = env->checkpointing_set_period(env, 60); CKERR(r); r = env->checkpointing_set_period(env, 5); CKERR(r);
DB **dbs = (DB**)toku_malloc(sizeof(DB*) * NUM_DBS); DB **dbs = (DB**)toku_malloc(sizeof(DB*) * NUM_DBS);
assert(dbs != NULL); assert(dbs != NULL);
// -------------------------- // --------------------------
upgrade_test_4(dbs); upgrade_test_4(dbs, test_to_do);
// -------------------------- // --------------------------
if (verbose >= 2) if (verbose >= 2)
...@@ -230,13 +271,17 @@ int test_main(int argc, char * const *argv) { ...@@ -230,13 +271,17 @@ int test_main(int argc, char * const *argv) {
do_args(argc, argv); do_args(argc, argv);
littlenode = 0; littlenode = 0;
setup(); setup();
run_test(); run_test(insert);
setup();
run_test(delete);
if (SRC_VERSION == 4) { if (SRC_VERSION == 4) {
if (verbose) if (verbose)
printf("Now repeat test with small nodes and small cache.\n"); printf("Now repeat test with small nodes and small cache.\n");
littlenode = 1; // 4k nodes, small cache littlenode = 1; // 4k nodes, small cache
setup(); setup();
run_test(); run_test(insert);
setup();
run_test(delete);
} }
return 0; return 0;
} }
......
...@@ -159,13 +159,17 @@ static void check_results(DB **dbs) ...@@ -159,13 +159,17 @@ static void check_results(DB **dbs)
assert((unsigned int)pkey_for_db_key == (unsigned int)pkey_for_val(v, j)); assert((unsigned int)pkey_for_db_key == (unsigned int)pkey_for_val(v, j));
// printf(" DB[%d] key = %10u, val = %10u, pkey_for_db_key = %10u, pkey_for_val=%10d\n", j, v, k, pkey_for_db_key, pkey_for_val(v, j)); // printf(" DB[%d] key = %10u, val = %10u, pkey_for_db_key = %10u, pkey_for_val=%10d\n", j, v, k, pkey_for_db_key, pkey_for_val(v, j));
} }
{printf("."); fflush(stdout);} if (verbose) {
printf(".");
fflush(stdout);
}
r = cursor->c_close(cursor); r = cursor->c_close(cursor);
CKERR(r); CKERR(r);
r = txn->commit(txn, 0); r = txn->commit(txn, 0);
CKERR(r); CKERR(r);
} }
printf("\nCheck OK\n"); if (verbose)
printf("\nCheck OK\n");
} }
static void *expect_poll_void = &expect_poll_void; static void *expect_poll_void = &expect_poll_void;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment