Commit bc03f282 authored by Rich Prohaska's avatar Rich Prohaska Committed by Yoni Fogel

#3043 merge a new hotindex undo function to main refs[t:3043]

git-svn-id: file:///svn/toku/tokudb@25766 c7de825b-a66e-492c-adef-691d508d4ae1
parent 9bb62a9b
...@@ -10,6 +10,14 @@ ...@@ -10,6 +10,14 @@
#ifndef TOKU_INDEXER_INTERNAL_H #ifndef TOKU_INDEXER_INTERNAL_H
#define TOKU_INDEXER_INTERNAL_H #define TOKU_INDEXER_INTERNAL_H
// the indexer_commit_keys is a set of keys described by a DBT in the keys array.
// the array is a resizeable array with max size "max_keys" and current size "current_keys".
struct indexer_commit_keys {
int max_keys; // max number of keys
int current_keys; // number of valid keys
DBT *keys; // the variable length keys array
};
struct __toku_indexer_internal { struct __toku_indexer_internal {
DB_ENV *env; DB_ENV *env;
DB_TXN *txn; DB_TXN *txn;
...@@ -27,10 +35,15 @@ struct __toku_indexer_internal { ...@@ -27,10 +35,15 @@ struct __toku_indexer_internal {
FILENUM *fnums; /* [N] */ FILENUM *fnums; /* [N] */
FILENUMS filenums; FILENUMS filenums;
// undo state
struct indexer_commit_keys commit_keys; // set of keys to commit
DBT hotkey, hotval; // current hot key and value
DBT previous_insert_key; // previous insert key
// test functions // test functions
int (*undo_do)(DB_INDEXER *indexer, DB *hotdb, ULEHANDLE ule); int (*undo_do)(DB_INDEXER *indexer, DB *hotdb, ULEHANDLE ule);
int (*test_is_xid_live)(DB_INDEXER *indexer, TXNID xid); int (*test_is_xid_live)(DB_INDEXER *indexer, TXNID xid);
int (*test_maybe_lock_provisional_key)(DB_INDEXER *indexer, TXNID xid, DB *hotdb, DBT *key); int (*test_lock_key)(DB_INDEXER *indexer, TXNID xid, DB *hotdb, DBT *key);
int (*test_delete_provisional)(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, XIDS xids); int (*test_delete_provisional)(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, XIDS xids);
int (*test_delete_committed)(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, XIDS xids); int (*test_delete_committed)(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, XIDS xids);
int (*test_insert_provisional)(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, DBT *hotval, XIDS xids); int (*test_insert_provisional)(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, DBT *hotval, XIDS xids);
...@@ -41,6 +54,10 @@ struct __toku_indexer_internal { ...@@ -41,6 +54,10 @@ struct __toku_indexer_internal {
int test_only_flags; int test_only_flags;
}; };
void indexer_undo_do_init(DB_INDEXER *indexer);
void indexer_undo_do_destroy(DB_INDEXER *indexer);
int indexer_undo_do(DB_INDEXER *indexer, DB *hotdb, ULEHANDLE ule); int indexer_undo_do(DB_INDEXER *indexer, DB *hotdb, ULEHANDLE ule);
#endif #endif
This diff is collapsed.
...@@ -92,6 +92,7 @@ free_indexer_resources(DB_INDEXER *indexer) { ...@@ -92,6 +92,7 @@ free_indexer_resources(DB_INDEXER *indexer) {
toku_free(indexer->i->fnums); toku_free(indexer->i->fnums);
indexer->i->fnums = NULL; indexer->i->fnums = NULL;
} }
indexer_undo_do_destroy(indexer);
indexer_release_refs(indexer); indexer_release_refs(indexer);
// indexer->i // indexer->i
toku_free(indexer->i); toku_free(indexer->i);
...@@ -172,6 +173,7 @@ toku_indexer_create_indexer(DB_ENV *env, ...@@ -172,6 +173,7 @@ toku_indexer_create_indexer(DB_ENV *env,
create_exit: create_exit:
if ( rval == 0 ) { if ( rval == 0 ) {
indexer_undo_do_init(indexer);
indexer_add_refs(indexer); indexer_add_refs(indexer);
*indexerp = indexer; *indexerp = indexer;
......
...@@ -195,14 +195,13 @@ test_is_xid_live(DB_INDEXER *indexer, TXNID xid) { ...@@ -195,14 +195,13 @@ test_is_xid_live(DB_INDEXER *indexer, TXNID xid) {
} }
static int static int
test_maybe_lock_provisional_key(DB_INDEXER *indexer, TXNID xid, DB *hotdb, DBT *key) { test_lock_key(DB_INDEXER *indexer, TXNID xid, DB *hotdb, DBT *key) {
invariant(indexer == test_indexer); invariant(indexer == test_indexer);
invariant(hotdb == test_hotdb); invariant(hotdb == test_hotdb);
if (test_is_xid_live(indexer, xid)) { invariant(test_is_xid_live(indexer, xid));
printf("lock [%lu] ", xid); printf("lock [%lu] ", xid);
print_dbt(key); print_dbt(key);
printf("\n"); printf("\n");
}
return 0; return 0;
} }
...@@ -360,19 +359,19 @@ read_test(char *testname, ULE ule) { ...@@ -360,19 +359,19 @@ read_test(char *testname, ULE ule) {
ule_add_provisional(ule, &uxr_s); ule_add_provisional(ule, &uxr_s);
continue; continue;
} }
printf("%s???\n", line); fprintf(stderr, "%s???\n", line);
r = EINVAL; r = EINVAL;
} }
toku_free(line); toku_free(line);
fclose(f); fclose(f);
} else { } else {
r = errno; r = errno;
printf("fopen %s errno=%d\n", testname, errno); fprintf(stderr, "fopen %s errno=%d\n", testname, errno);
} }
return r; return r;
} }
static void static int
run_test(char *envdir, char *testname) { run_test(char *envdir, char *testname) {
if (verbose) if (verbose)
printf("%s\n", testname); printf("%s\n", testname);
...@@ -403,7 +402,7 @@ run_test(char *envdir, char *testname) { ...@@ -403,7 +402,7 @@ run_test(char *envdir, char *testname) {
// set test callbacks // set test callbacks
indexer->i->test_is_xid_live = test_is_xid_live; indexer->i->test_is_xid_live = test_is_xid_live;
indexer->i->test_maybe_lock_provisional_key = test_maybe_lock_provisional_key; indexer->i->test_lock_key = test_lock_key;
indexer->i->test_delete_provisional = test_delete_provisional; indexer->i->test_delete_provisional = test_delete_provisional;
indexer->i->test_delete_committed = test_delete_committed; indexer->i->test_delete_committed = test_delete_committed;
indexer->i->test_insert_provisional = test_insert_provisional; indexer->i->test_insert_provisional = test_insert_provisional;
...@@ -419,7 +418,9 @@ run_test(char *envdir, char *testname) { ...@@ -419,7 +418,9 @@ run_test(char *envdir, char *testname) {
ule_init(ule); ule_init(ule);
// read the test // read the test
r = read_test(testname, ule); assert_zero(r); r = read_test(testname, ule);
if (r != 0)
return r;
r = indexer->i->undo_do(indexer, dest_db, ule); assert_zero(r); r = indexer->i->undo_do(indexer, dest_db, ule); assert_zero(r);
...@@ -435,6 +436,8 @@ run_test(char *envdir, char *testname) { ...@@ -435,6 +436,8 @@ run_test(char *envdir, char *testname) {
r = env->close(env, 0); assert_zero(r); r = env->close(env, 0); assert_zero(r);
live_destroy(&live_xids); live_destroy(&live_xids);
return r;
} }
int int
...@@ -457,7 +460,7 @@ test_main(int argc, char * const argv[]) { ...@@ -457,7 +460,7 @@ test_main(int argc, char * const argv[]) {
break; break;
} }
for ( ; i < argc; i++) { for (r = 0 ; r == 0 && i < argc; i++) {
char *testname = argv[i]; char *testname = argv[i];
char envdir[strlen(ENVDIR) + 1 + 32 + 1]; char envdir[strlen(ENVDIR) + 1 + 32 + 1];
sprintf(envdir, "%s.%d", ENVDIR, toku_os_getpid()); sprintf(envdir, "%s.%d", ENVDIR, toku_os_getpid());
...@@ -467,9 +470,9 @@ test_main(int argc, char * const argv[]) { ...@@ -467,9 +470,9 @@ test_main(int argc, char * const argv[]) {
r = system(syscmd); assert_zero(r); r = system(syscmd); assert_zero(r);
r = toku_os_mkdir(envdir, S_IRWXU+S_IRWXG+S_IRWXO); assert_zero(r); r = toku_os_mkdir(envdir, S_IRWXU+S_IRWXG+S_IRWXO); assert_zero(r);
run_test(envdir, testname); r = run_test(envdir, testname);
} }
return 0; return r;
} }
key k1
delete committed 0
delete committed 100
delete committed 200
insert_committed [200] v100 k1
commit_any [200] v100
key k1
delete committed 0
delete committed 100
insert committed 200 v100
key k1
delete committed 0
delete committed 100
insert_committed [100] v100 k1
commit_any [100] v100
delete_committed [200] v100
commit_any [200] v100
key k1
delete committed 0
insert committed 100 v100
delete committed 200
insert_committed [0] v0 k1
delete_committed [100] v0
commit_any [100] v0
insert_committed [200] v100 k1
commit_any [200] v100
key k1
insert committed 0 v0
delete committed 100
insert committed 200 v100
insert_committed [0] v10 k1
delete_committed [100] v10
commit_any [100] v10
key k1
insert committed 0 v10
delete committed 100
insert_committed [0] v0 k1
delete_committed [100] v0
insert_committed [100] v100 k1
commit_any [100] v0
commit_any [100] v100
delete_committed [200] v100
commit_any [200] v100
key k1
insert committed 0 v0
insert committed 100 v100
delete committed 200
insert_committed [0] v0 k1
delete_committed [100] v0
insert_committed [100] v100 k1
commit_any [100] v0
commit_any [100] v100
delete_committed [200] v100
insert_committed [200] v200 k1
commit_any [200] v100
commit_any [200] v200
key k1
insert committed 0 v0
insert committed 100 v100
insert committed 200 v200
insert_committed [0] v10 k1
delete_committed [100] v10
insert_committed [100] v20 k1
commit_any [100] v10
commit_any [100] v20
key k1
insert committed 0 v10
insert committed 100 v20
insert_committed [0] v100 k1
delete_committed [200] v100
insert_committed [200] v200 k1
commit_any [200] v100
commit_any [200] v200
delete_committed [300] v200
insert_committed [300] v300 k1
commit_any [300] v200
commit_any [300] v300
key k1
insert committed 0 v100
insert committed 200 v200
insert committed 300 v300
key k1 key k1
delete committed 0 delete committed 0
insert committed 100 v10
insert provisional 300 v18 insert provisional 300 v18
placeholder 301 placeholder 301
insert provisional 302 v20 insert provisional 302 v20
...@@ -7,9 +7,8 @@ delete_committed [200] v20 ...@@ -7,9 +7,8 @@ delete_committed [200] v20
insert_committed [200] v10 k1 insert_committed [200] v10 k1
commit_any [200] v20 commit_any [200] v20
commit_any [200] v10 commit_any [200] v10
delete_committed [300,301] v10 delete_committed [300] v10
insert_committed [300,301] v30 k1 insert_committed [300] v30 k1
commit_any [300,301] v10 delete_committed [300] v30
commit_any [300,301] v30 commit_any [300] v10
delete_committed [300,301,302] v30 commit_any [300] v30
commit_any [300,301,302] v30
key k1
delete committed 0
delete provisional 100
insert_committed [100] v100 k1 insert_committed [100] v100 k1
delete_committed [100] v100
commit_any [100] v100 commit_any [100] v100
key k1
delete committed 0
insert provisional 100 v100
delete provisional 200
insert_committed [100] v100 k1
insert_committed [0] v10 k1
delete_committed [100] v10
commit_any [100] v10
key k1
insert committed 0 v10
delete provisional 100
insert_committed [0] v10 k1
delete_committed [100] v10
insert_committed [100] v100 k1
commit_any [100] v10
key k1
insert committed 0 v10
insert provisional 100 v100
live 100
key k1
delete committed 0
delete provisional 100
insert_provisional [100] v100 k1
lock [100] v100
delete_provisional [100,200] v100
lock [100] v100
lock [100] v100
live 100 200
key k1
delete committed 0
insert provisional 100 v100
delete provisional 200
insert_committed [0] v10 k1
delete_provisional [100] v10
lock [100] v10
lock [100] v10
live 100
key k1
insert committed 0 v10
delete provisional 100
insert_committed [0] v10 k1
delete_provisional [100] v10
lock [100] v10
insert_provisional [100] v100 k1
lock [100] v100
live 100
key k1
insert committed 0 v10
insert provisional 100 v100
...@@ -4,10 +4,11 @@ ...@@ -4,10 +4,11 @@
tests="" tests=""
verbose=0 verbose=0
valgrind=""
for arg in $* ; do for arg in $* ; do
if [ $arg = "--verbose" ] ; then if [[ $arg =~ "--(.*)=(.*)" ]] ; then
verbose=1 eval ${BASH_REMATCH[1]}=${BASH_REMATCH[2]}
else else
tests="$tests $arg" tests="$tests $arg"
fi fi
...@@ -26,7 +27,7 @@ for t in $tests ; do ...@@ -26,7 +27,7 @@ for t in $tests ; do
fi fi
if [ $verbose != 0 ] ; then echo $testdir $testname $testfile $resultfile; fi if [ $verbose != 0 ] ; then echo $testdir $testname $testfile $resultfile; fi
./hotindexer-undo-do-test.tdb $testdir/$testfile >$testdir/$testname.run $valgrind ./hotindexer-undo-do-test.tdb $testdir/$testfile >$testdir/$testname.run
if [ -f $testdir/$resultfile ] ; then if [ -f $testdir/$resultfile ] ; then
diff -q $testdir/$testname.run $testdir/$resultfile >/dev/null 2>&1 diff -q $testdir/$testname.run $testdir/$resultfile >/dev/null 2>&1
......
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