mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 14:54:20 +01:00
fixes #5490 get rid of the last nodup stuff
git-svn-id: file:///svn/toku/tokudb@48251 c7de825b-a66e-492c-adef-691d508d4ae1
This commit is contained in:
parent
3364bd0b0e
commit
53e33b7531
10 changed files with 3 additions and 654 deletions
|
@ -181,9 +181,7 @@ int toku_ft_cursor_get (FT_CURSOR cursor, DBT *key, FT_GET_CALLBACK_FUNCTION get
|
||||||
int toku_ft_cursor_first(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
int toku_ft_cursor_first(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
||||||
int toku_ft_cursor_last(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
int toku_ft_cursor_last(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
||||||
int toku_ft_cursor_next(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
int toku_ft_cursor_next(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
||||||
int toku_ft_cursor_next_nodup(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
|
||||||
int toku_ft_cursor_prev(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
int toku_ft_cursor_prev(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
||||||
int toku_ft_cursor_prev_nodup(FT_CURSOR cursor, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
|
||||||
int toku_ft_cursor_current(FT_CURSOR cursor, int op, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
int toku_ft_cursor_current(FT_CURSOR cursor, int op, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
||||||
int toku_ft_cursor_set(FT_CURSOR cursor, DBT *key, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
int toku_ft_cursor_set(FT_CURSOR cursor, DBT *key, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
||||||
int toku_ft_cursor_set_range(FT_CURSOR cursor, DBT *key, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
int toku_ft_cursor_set_range(FT_CURSOR cursor, DBT *key, FT_GET_CALLBACK_FUNCTION getf, void *getf_v) __attribute__ ((warn_unused_result));
|
||||||
|
|
|
@ -2688,7 +2688,7 @@ int toku_ft_loader_get_error(FTLOADER bl, int *error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_pair_to_leafnode (struct leaf_buf *lbuf, unsigned char *key, int keylen, unsigned char *val, int vallen, int this_leafentry_size, STAT64INFO stats_to_update) {
|
static void add_pair_to_leafnode (struct leaf_buf *lbuf, unsigned char *key, int keylen, unsigned char *val, int vallen, int this_leafentry_size, STAT64INFO stats_to_update) {
|
||||||
lbuf->nkeys++; // assume NODUP
|
lbuf->nkeys++;
|
||||||
lbuf->ndata++;
|
lbuf->ndata++;
|
||||||
lbuf->dsize += keylen + vallen;
|
lbuf->dsize += keylen + vallen;
|
||||||
lbuf->off += this_leafentry_size;
|
lbuf->off += this_leafentry_size;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
Memory format of packed nodup leaf entry
|
Memory format of packed leaf entry
|
||||||
CONSTANTS:
|
CONSTANTS:
|
||||||
num_uxrs
|
num_uxrs
|
||||||
keylen
|
keylen
|
||||||
|
|
|
@ -58,7 +58,7 @@ const struct logtype rollbacks[] = {
|
||||||
{"fcreate", 'F', FA{{"FILENUM", "filenum", 0},
|
{"fcreate", 'F', FA{{"FILENUM", "filenum", 0},
|
||||||
{"BYTESTRING", "iname", 0},
|
{"BYTESTRING", "iname", 0},
|
||||||
NULLFIELD}, LOG_BEGIN_ACTION_NA},
|
NULLFIELD}, LOG_BEGIN_ACTION_NA},
|
||||||
// cmdinsert is used to insert a key-value pair into a NODUP DB. For rollback we don't need the data.
|
// cmdinsert is used to insert a key-value pair into a DB. For rollback we don't need the data.
|
||||||
{"cmdinsert", 'i', FA{
|
{"cmdinsert", 'i', FA{
|
||||||
{"FILENUM", "filenum", 0},
|
{"FILENUM", "filenum", 0},
|
||||||
{"BYTESTRING", "key", 0},
|
{"BYTESTRING", "key", 0},
|
||||||
|
|
|
@ -231,8 +231,6 @@ if(BUILD_TESTING)
|
||||||
test_db_descriptor
|
test_db_descriptor
|
||||||
test_db_descriptor_named_db
|
test_db_descriptor_named_db
|
||||||
test_db_txn_locks_read_uncommitted
|
test_db_txn_locks_read_uncommitted
|
||||||
test_dupsort_get_both_range_reverse
|
|
||||||
test_dupsort_set_range_reverse
|
|
||||||
test_get_max_row_size
|
test_get_max_row_size
|
||||||
test_large_update_broadcast_small_cachetable
|
test_large_update_broadcast_small_cachetable
|
||||||
test_locktree_close
|
test_locktree_close
|
||||||
|
|
|
@ -1,218 +0,0 @@
|
||||||
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
|
|
||||||
#ident "$Id$"
|
|
||||||
#ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved."
|
|
||||||
#ident "The technology is licensed by the Massachusetts Institute of Technology, Rutgers State University of New Jersey, and the Research Foundation of State University of New York at Stony Brook under United States of America Serial No. 11/760379 and to the patents and/or patent applications resulting from it."
|
|
||||||
// this test verifies that db creation after a checkpoint works for nodup and dupsort dictionaries
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include "test.h"
|
|
||||||
|
|
||||||
|
|
||||||
const int envflags = DB_INIT_MPOOL|DB_CREATE|DB_THREAD |DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_TXN|DB_PRIVATE;
|
|
||||||
const char *namea="a.db";
|
|
||||||
const char *nameb="b.db";
|
|
||||||
|
|
||||||
static void run_test (bool do_commit, bool do_abort) {
|
|
||||||
int r;
|
|
||||||
r = system("rm -rf " ENVDIR);
|
|
||||||
CKERR(r);
|
|
||||||
toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO);
|
|
||||||
|
|
||||||
DB_ENV *env;
|
|
||||||
DB *dba, *dbb;
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
|
|
||||||
r = db_create(&dba, env, 0); CKERR(r);
|
|
||||||
// r = dba->set_flags(dba, DB_DUPSORT); CKERR(r);
|
|
||||||
r = dba->open(dba, NULL, namea, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
r = env->txn_checkpoint(env, 0, 0, 0); CKERR(r);
|
|
||||||
|
|
||||||
r = db_create(&dbb, env, 0); CKERR(r);
|
|
||||||
r = dbb->open(dbb, NULL, nameb, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
DB_TXN *txn;
|
|
||||||
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
|
|
||||||
{
|
|
||||||
DBT a,b;
|
|
||||||
dbt_init(&a, "a", 2);
|
|
||||||
dbt_init(&b, "b", 2);
|
|
||||||
r = dba->put(dba, txn, &a, &b, 0); CKERR(r);
|
|
||||||
r = dbb->put(dbb, txn, &b, &a, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
//printf("opened\n");
|
|
||||||
if (do_commit) {
|
|
||||||
r = txn->commit(txn, 0); CKERR(r);
|
|
||||||
} else if (do_abort) {
|
|
||||||
r = txn->abort(txn); CKERR(r);
|
|
||||||
|
|
||||||
// force an fsync of the log
|
|
||||||
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
|
|
||||||
r = txn->commit(txn, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
//printf("shutdown\n");
|
|
||||||
toku_hard_crash_on_purpose();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_recover (bool did_commit) {
|
|
||||||
DB_ENV *env;
|
|
||||||
DB *dba, *dbb;
|
|
||||||
int r;
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags|DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
r = db_create(&dba, env, 0); CKERR(r);
|
|
||||||
r = dba->open(dba, NULL, namea, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
uint32_t dbflags;
|
|
||||||
dbflags = 0;
|
|
||||||
r = dba->get_flags(dba, &dbflags); CKERR(r);
|
|
||||||
assert(dbflags == 0);
|
|
||||||
|
|
||||||
r = db_create(&dbb, env, 0); CKERR(r);
|
|
||||||
r = dba->open(dbb, NULL, nameb, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
dbflags = 0;
|
|
||||||
r = dbb->get_flags(dbb, &dbflags); CKERR(r);
|
|
||||||
assert(dbflags == 0);
|
|
||||||
|
|
||||||
DBT aa, ab;
|
|
||||||
dbt_init(&aa, NULL, 0);
|
|
||||||
dbt_init(&ab, NULL, 0);
|
|
||||||
DBT ba, bb;
|
|
||||||
dbt_init(&ba, NULL, 0);
|
|
||||||
dbt_init(&bb, NULL, 0);
|
|
||||||
DB_TXN *txn;
|
|
||||||
DBC *ca,*cb;
|
|
||||||
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
|
|
||||||
r = dba->cursor(dba, txn, &ca, 0); CKERR(r);
|
|
||||||
r = dbb->cursor(dbb, txn, &cb, 0); CKERR(r);
|
|
||||||
int ra = ca->c_get(ca, &aa, &ab, DB_FIRST); CKERR(r);
|
|
||||||
int rb = cb->c_get(cb, &ba, &bb, DB_FIRST); CKERR(r);
|
|
||||||
if (did_commit) {
|
|
||||||
assert(ra==0);
|
|
||||||
assert(rb==0);
|
|
||||||
// verify key-value pairs
|
|
||||||
assert(aa.size==2);
|
|
||||||
assert(ab.size==2);
|
|
||||||
assert(ba.size==2);
|
|
||||||
assert(bb.size==2);
|
|
||||||
const char a[2] = "a";
|
|
||||||
const char b[2] = "b";
|
|
||||||
assert(memcmp(aa.data, &a, 2)==0);
|
|
||||||
assert(memcmp(ab.data, &b, 2)==0);
|
|
||||||
assert(memcmp(ab.data, &b, 2)==0);
|
|
||||||
assert(memcmp(bb.data, &a, 2)==0);
|
|
||||||
// make sure no other entries in DB
|
|
||||||
assert(ca->c_get(ca, &aa, &ab, DB_NEXT) == DB_NOTFOUND);
|
|
||||||
assert(cb->c_get(cb, &ba, &bb, DB_NEXT) == DB_NOTFOUND);
|
|
||||||
fprintf(stderr, "Both verified. Yay!\n");
|
|
||||||
} else {
|
|
||||||
// It wasn't committed (it also wasn't aborted), but a checkpoint happened.
|
|
||||||
assert(ra==DB_NOTFOUND);
|
|
||||||
assert(rb==DB_NOTFOUND);
|
|
||||||
fprintf(stderr, "Neither present. Yay!\n");
|
|
||||||
}
|
|
||||||
r = ca->c_close(ca); CKERR(r);
|
|
||||||
r = cb->c_close(cb); CKERR(r);
|
|
||||||
r = txn->commit(txn, 0); CKERR(r);
|
|
||||||
r = dba->close(dba, 0); CKERR(r);
|
|
||||||
r = dbb->close(dbb, 0); CKERR(r);
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_recover_only (void) {
|
|
||||||
DB_ENV *env;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags|DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_no_recover (void) {
|
|
||||||
DB_ENV *env;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags & ~DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO);
|
|
||||||
assert(r == DB_RUNRECOVERY);
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cmd;
|
|
||||||
|
|
||||||
|
|
||||||
bool do_commit=false, do_abort=false, do_explicit_abort=false, do_recover_committed=false, do_recover_aborted=false, do_recover_only=false, do_no_recover = false;
|
|
||||||
|
|
||||||
static void test_parse_args (int argc, char * const argv[]) {
|
|
||||||
int resultcode;
|
|
||||||
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], "--commit")==0) {
|
|
||||||
do_commit=true;
|
|
||||||
} else if (strcmp(argv[0], "--abort")==0 || strcmp(argv[0], "--test") == 0) {
|
|
||||||
do_abort=true;
|
|
||||||
} else if (strcmp(argv[0], "--explicit-abort")==0) {
|
|
||||||
do_explicit_abort=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover-committed")==0) {
|
|
||||||
do_recover_committed=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover-aborted")==0 || strcmp(argv[0], "--recover") == 0) {
|
|
||||||
do_recover_aborted=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover-only") == 0) {
|
|
||||||
do_recover_only=true;
|
|
||||||
} else if (strcmp(argv[0], "--no-recover") == 0) {
|
|
||||||
do_no_recover=true;
|
|
||||||
} else if (strcmp(argv[0], "-h")==0) {
|
|
||||||
resultcode=0;
|
|
||||||
do_usage:
|
|
||||||
fprintf(stderr, "Usage:\n%s [-v|-q]* [-h] {--commit | --abort | --explicit-abort | --recover-committed | --recover-aborted } \n", cmd);
|
|
||||||
exit(resultcode);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Unknown arg: %s\n", argv[0]);
|
|
||||||
resultcode=1;
|
|
||||||
goto do_usage;
|
|
||||||
}
|
|
||||||
argc--;
|
|
||||||
argv++;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int n_specified=0;
|
|
||||||
if (do_commit) n_specified++;
|
|
||||||
if (do_abort) n_specified++;
|
|
||||||
if (do_explicit_abort) n_specified++;
|
|
||||||
if (do_recover_committed) n_specified++;
|
|
||||||
if (do_recover_aborted) n_specified++;
|
|
||||||
if (do_recover_only) n_specified++;
|
|
||||||
if (do_no_recover) n_specified++;
|
|
||||||
if (n_specified>1) {
|
|
||||||
printf("Specify only one of --commit or --abort or --recover-committed or --recover-aborted\n");
|
|
||||||
resultcode=1;
|
|
||||||
goto do_usage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_main (int argc, char * const argv[]) {
|
|
||||||
test_parse_args(argc, argv);
|
|
||||||
if (do_commit) {
|
|
||||||
run_test(true, false);
|
|
||||||
} else if (do_abort) {
|
|
||||||
run_test(false, true);
|
|
||||||
} else if (do_recover_committed) {
|
|
||||||
run_recover(true);
|
|
||||||
} else if (do_recover_aborted) {
|
|
||||||
run_recover(false);
|
|
||||||
} else if (do_recover_only) {
|
|
||||||
run_recover_only();
|
|
||||||
} else if (do_no_recover) {
|
|
||||||
run_no_recover();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,218 +0,0 @@
|
||||||
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
|
|
||||||
#ident "$Id$"
|
|
||||||
#ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved."
|
|
||||||
#ident "The technology is licensed by the Massachusetts Institute of Technology, Rutgers State University of New Jersey, and the Research Foundation of State University of New York at Stony Brook under United States of America Serial No. 11/760379 and to the patents and/or patent applications resulting from it."
|
|
||||||
// this test verifies that db creation after a checkpoint works for nodup and dupsort dictionaries
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include "test.h"
|
|
||||||
|
|
||||||
|
|
||||||
const int envflags = DB_INIT_MPOOL|DB_CREATE|DB_THREAD |DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_TXN|DB_PRIVATE;
|
|
||||||
const char *namea="a.db";
|
|
||||||
const char *nameb="b.db";
|
|
||||||
|
|
||||||
static void run_test (bool do_commit, bool do_abort) {
|
|
||||||
int r;
|
|
||||||
r = system("rm -rf " ENVDIR);
|
|
||||||
CKERR(r);
|
|
||||||
toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO);
|
|
||||||
|
|
||||||
DB_ENV *env;
|
|
||||||
DB *dba, *dbb;
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
|
|
||||||
r = db_create(&dba, env, 0); CKERR(r);
|
|
||||||
// r = dba->set_flags(dba, DB_DUPSORT); CKERR(r);
|
|
||||||
r = dba->open(dba, NULL, namea, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
r = env->txn_checkpoint(env, 0, 0, 0); CKERR(r);
|
|
||||||
|
|
||||||
r = db_create(&dbb, env, 0); CKERR(r);
|
|
||||||
r = dbb->open(dbb, NULL, nameb, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
DB_TXN *txn;
|
|
||||||
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
|
|
||||||
{
|
|
||||||
DBT a,b;
|
|
||||||
dbt_init(&a, "a", 2);
|
|
||||||
dbt_init(&b, "b", 2);
|
|
||||||
r = dba->put(dba, txn, &a, &b, 0); CKERR(r);
|
|
||||||
r = dbb->put(dbb, txn, &b, &a, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
//printf("opened\n");
|
|
||||||
if (do_commit) {
|
|
||||||
r = txn->commit(txn, 0); CKERR(r);
|
|
||||||
} else if (do_abort) {
|
|
||||||
r = txn->abort(txn); CKERR(r);
|
|
||||||
|
|
||||||
// force an fsync of the log
|
|
||||||
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
|
|
||||||
r = txn->commit(txn, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
//printf("shutdown\n");
|
|
||||||
toku_hard_crash_on_purpose();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_recover (bool did_commit) {
|
|
||||||
DB_ENV *env;
|
|
||||||
DB *dba, *dbb;
|
|
||||||
int r;
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags|DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
r = db_create(&dba, env, 0); CKERR(r);
|
|
||||||
r = dba->open(dba, NULL, namea, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
uint32_t dbflags;
|
|
||||||
dbflags = 0;
|
|
||||||
r = dba->get_flags(dba, &dbflags); CKERR(r);
|
|
||||||
assert(dbflags == 0);
|
|
||||||
|
|
||||||
r = db_create(&dbb, env, 0); CKERR(r);
|
|
||||||
r = dba->open(dbb, NULL, nameb, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
dbflags = 0;
|
|
||||||
r = dbb->get_flags(dbb, &dbflags); CKERR(r);
|
|
||||||
assert(dbflags == 0);
|
|
||||||
|
|
||||||
DBT aa, ab;
|
|
||||||
dbt_init(&aa, NULL, 0);
|
|
||||||
dbt_init(&ab, NULL, 0);
|
|
||||||
DBT ba, bb;
|
|
||||||
dbt_init(&ba, NULL, 0);
|
|
||||||
dbt_init(&bb, NULL, 0);
|
|
||||||
DB_TXN *txn;
|
|
||||||
DBC *ca,*cb;
|
|
||||||
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
|
|
||||||
r = dba->cursor(dba, txn, &ca, 0); CKERR(r);
|
|
||||||
r = dbb->cursor(dbb, txn, &cb, 0); CKERR(r);
|
|
||||||
int ra = ca->c_get(ca, &aa, &ab, DB_FIRST); CKERR(r);
|
|
||||||
int rb = cb->c_get(cb, &ba, &bb, DB_FIRST); CKERR(r);
|
|
||||||
if (did_commit) {
|
|
||||||
assert(ra==0);
|
|
||||||
assert(rb==0);
|
|
||||||
// verify key-value pairs
|
|
||||||
assert(aa.size==2);
|
|
||||||
assert(ab.size==2);
|
|
||||||
assert(ba.size==2);
|
|
||||||
assert(bb.size==2);
|
|
||||||
const char a[2] = "a";
|
|
||||||
const char b[2] = "b";
|
|
||||||
assert(memcmp(aa.data, &a, 2)==0);
|
|
||||||
assert(memcmp(ab.data, &b, 2)==0);
|
|
||||||
assert(memcmp(ab.data, &b, 2)==0);
|
|
||||||
assert(memcmp(bb.data, &a, 2)==0);
|
|
||||||
// make sure no other entries in DB
|
|
||||||
assert(ca->c_get(ca, &aa, &ab, DB_NEXT) == DB_NOTFOUND);
|
|
||||||
assert(cb->c_get(cb, &ba, &bb, DB_NEXT) == DB_NOTFOUND);
|
|
||||||
fprintf(stderr, "Both verified. Yay!\n");
|
|
||||||
} else {
|
|
||||||
// It wasn't committed (it also wasn't aborted), but a checkpoint happened.
|
|
||||||
assert(ra==DB_NOTFOUND);
|
|
||||||
assert(rb==DB_NOTFOUND);
|
|
||||||
fprintf(stderr, "Neither present. Yay!\n");
|
|
||||||
}
|
|
||||||
r = ca->c_close(ca); CKERR(r);
|
|
||||||
r = cb->c_close(cb); CKERR(r);
|
|
||||||
r = txn->commit(txn, 0); CKERR(r);
|
|
||||||
r = dba->close(dba, 0); CKERR(r);
|
|
||||||
r = dbb->close(dbb, 0); CKERR(r);
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_recover_only (void) {
|
|
||||||
DB_ENV *env;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags|DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_no_recover (void) {
|
|
||||||
DB_ENV *env;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags & ~DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO);
|
|
||||||
assert(r == DB_RUNRECOVERY);
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cmd;
|
|
||||||
|
|
||||||
|
|
||||||
bool do_commit=false, do_abort=false, do_explicit_abort=false, do_recover_committed=false, do_recover_aborted=false, do_recover_only=false, do_no_recover = false;
|
|
||||||
|
|
||||||
static void test_parse_args (int argc, char * const argv[]) {
|
|
||||||
int resultcode;
|
|
||||||
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], "--commit")==0 || strcmp(argv[0], "--test") == 0) {
|
|
||||||
do_commit=true;
|
|
||||||
} else if (strcmp(argv[0], "--abort")==0) {
|
|
||||||
do_abort=true;
|
|
||||||
} else if (strcmp(argv[0], "--explicit-abort")==0) {
|
|
||||||
do_explicit_abort=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover-committed")==0 || strcmp(argv[0], "--recover") == 0) {
|
|
||||||
do_recover_committed=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover-aborted")==0) {
|
|
||||||
do_recover_aborted=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover-only") == 0) {
|
|
||||||
do_recover_only=true;
|
|
||||||
} else if (strcmp(argv[0], "--no-recover") == 0) {
|
|
||||||
do_no_recover=true;
|
|
||||||
} else if (strcmp(argv[0], "-h")==0) {
|
|
||||||
resultcode=0;
|
|
||||||
do_usage:
|
|
||||||
fprintf(stderr, "Usage:\n%s [-v|-q]* [-h] {--commit | --abort | --explicit-abort | --recover-committed | --recover-aborted } \n", cmd);
|
|
||||||
exit(resultcode);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Unknown arg: %s\n", argv[0]);
|
|
||||||
resultcode=1;
|
|
||||||
goto do_usage;
|
|
||||||
}
|
|
||||||
argc--;
|
|
||||||
argv++;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int n_specified=0;
|
|
||||||
if (do_commit) n_specified++;
|
|
||||||
if (do_abort) n_specified++;
|
|
||||||
if (do_explicit_abort) n_specified++;
|
|
||||||
if (do_recover_committed) n_specified++;
|
|
||||||
if (do_recover_aborted) n_specified++;
|
|
||||||
if (do_recover_only) n_specified++;
|
|
||||||
if (do_no_recover) n_specified++;
|
|
||||||
if (n_specified>1) {
|
|
||||||
printf("Specify only one of --commit or --abort or --recover-committed or --recover-aborted\n");
|
|
||||||
resultcode=1;
|
|
||||||
goto do_usage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_main (int argc, char * const argv[]) {
|
|
||||||
test_parse_args(argc, argv);
|
|
||||||
if (do_commit) {
|
|
||||||
run_test(true, false);
|
|
||||||
} else if (do_abort) {
|
|
||||||
run_test(false, true);
|
|
||||||
} else if (do_recover_committed) {
|
|
||||||
run_recover(true);
|
|
||||||
} else if (do_recover_aborted) {
|
|
||||||
run_recover(false);
|
|
||||||
} else if (do_recover_only) {
|
|
||||||
run_recover_only();
|
|
||||||
} else if (do_no_recover) {
|
|
||||||
run_no_recover();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,132 +0,0 @@
|
||||||
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
|
|
||||||
#ident "$Id$"
|
|
||||||
#ident "Copyright (c) 2007-2012 Tokutek Inc. All rights reserved."
|
|
||||||
#ident "The technology is licensed by the Massachusetts Institute of Technology, Rutgers State University of New Jersey, and the Research Foundation of State University of New York at Stony Brook under United States of America Serial No. 11/760379 and to the patents and/or patent applications resulting from it."
|
|
||||||
// this test makes sure that fassociate can open nodup and dupsort dictionaries
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include "test.h"
|
|
||||||
|
|
||||||
|
|
||||||
const int envflags = DB_INIT_MPOOL|DB_CREATE|DB_THREAD |DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_TXN|DB_PRIVATE;
|
|
||||||
|
|
||||||
const char *namea="a.db";
|
|
||||||
const char *nameb="b.db";
|
|
||||||
|
|
||||||
static void run_test (void) {
|
|
||||||
int r;
|
|
||||||
r = system("rm -rf " ENVDIR);
|
|
||||||
CKERR(r);
|
|
||||||
toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO);
|
|
||||||
DB_ENV *env;
|
|
||||||
DB *dba, *dbb;
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
|
|
||||||
r = db_create(&dba, env, 0); CKERR(r);
|
|
||||||
r = dba->open(dba, NULL, namea, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
r = db_create(&dbb, env, 0); CKERR(r);
|
|
||||||
r = dbb->open(dbb, NULL, nameb, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r);
|
|
||||||
|
|
||||||
DB_TXN *txn;
|
|
||||||
r = env->txn_begin(env, NULL, &txn, 0); CKERR(r);
|
|
||||||
{
|
|
||||||
DBT a,b;
|
|
||||||
dbt_init(&a, "a", 2);
|
|
||||||
dbt_init(&b, "b", 2);
|
|
||||||
r = dba->put(dba, txn, &a, &b, 0); CKERR(r);
|
|
||||||
r = env->txn_checkpoint(env, 0, 0, 0); CKERR(r);
|
|
||||||
r = dbb->put(dbb, txn, &b, &a, 0); CKERR(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = txn->commit(txn, 0); CKERR(r);
|
|
||||||
|
|
||||||
toku_hard_crash_on_purpose();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_recover (void) {
|
|
||||||
DB_ENV *env;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags + DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
|
|
||||||
uint32_t dbflags;
|
|
||||||
DB *dba;
|
|
||||||
r = db_create(&dba, env, 0); CKERR(r);
|
|
||||||
r = dba->open(dba, NULL, namea, NULL, DB_UNKNOWN, DB_AUTO_COMMIT, 0666); CKERR(r);
|
|
||||||
r = dba->get_flags(dba, &dbflags); CKERR(r);
|
|
||||||
r = dba->close(dba, 0); CKERR(r);
|
|
||||||
DB *dbb;
|
|
||||||
r = db_create(&dbb, env, 0); CKERR(r);
|
|
||||||
r = dbb->open(dbb, NULL, nameb, NULL, DB_UNKNOWN, DB_AUTO_COMMIT, 0666); CKERR(r);
|
|
||||||
r = dbb->get_flags(dbb, &dbflags); CKERR(r);
|
|
||||||
assert(dbflags == 0);
|
|
||||||
r = dbb->close(dbb, 0); CKERR(r);
|
|
||||||
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void run_no_recover (void) {
|
|
||||||
DB_ENV *env;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = db_env_create(&env, 0); CKERR(r);
|
|
||||||
r = env->open(env, ENVDIR, envflags & ~DB_RECOVER, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
r = env->close(env, 0); CKERR(r);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *cmd;
|
|
||||||
|
|
||||||
bool do_test=false, do_recover=false, do_recover_only=false, do_no_recover = false;
|
|
||||||
|
|
||||||
static void test_parse_args (int argc, char * const argv[]) {
|
|
||||||
int resultcode;
|
|
||||||
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], "--test")==0) {
|
|
||||||
do_test=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover") == 0) {
|
|
||||||
do_recover=true;
|
|
||||||
} else if (strcmp(argv[0], "--recover-only") == 0) {
|
|
||||||
do_recover_only=true;
|
|
||||||
} else if (strcmp(argv[0], "--no-recover") == 0) {
|
|
||||||
do_no_recover=true;
|
|
||||||
} else if (strcmp(argv[0], "-h")==0) {
|
|
||||||
resultcode=0;
|
|
||||||
do_usage:
|
|
||||||
fprintf(stderr, "Usage:\n%s [-v|-q]* [-h] {--test | --recover } \n", cmd);
|
|
||||||
exit(resultcode);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "Unknown arg: %s\n", argv[0]);
|
|
||||||
resultcode=1;
|
|
||||||
goto do_usage;
|
|
||||||
}
|
|
||||||
argc--;
|
|
||||||
argv++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_main (int argc, char * const argv[]) {
|
|
||||||
test_parse_args(argc, argv);
|
|
||||||
if (do_test) {
|
|
||||||
run_test();
|
|
||||||
} else if (do_recover) {
|
|
||||||
run_recover();
|
|
||||||
} else if (do_recover_only) {
|
|
||||||
run_recover();
|
|
||||||
} else if (do_no_recover) {
|
|
||||||
run_no_recover();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,79 +0,0 @@
|
||||||
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
||||||
// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
|
|
||||||
#ident "$Id$"
|
|
||||||
#ident "Copyright (c) 2007 Tokutek Inc. All rights reserved."
|
|
||||||
#include "test.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <memory.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <db.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* verify that the dup flags are written and read from the database file correctly */
|
|
||||||
static void
|
|
||||||
test_dup_flags (uint32_t dup_flags) {
|
|
||||||
if (verbose) printf("test_dup_flags:%u\n", dup_flags);
|
|
||||||
|
|
||||||
DB_TXN * const null_txn = 0;
|
|
||||||
const char * const fname = "test_dup_flags.ft_handle";
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = system("rm -rf " ENVDIR); CKERR(r);
|
|
||||||
r = toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r);
|
|
||||||
|
|
||||||
/* create the dup database file */
|
|
||||||
DB_ENV *env;
|
|
||||||
r = db_env_create(&env, 0); assert(r == 0);
|
|
||||||
r = env->open(env, ENVDIR, DB_CREATE+DB_PRIVATE+DB_INIT_MPOOL, 0); assert(r == 0);
|
|
||||||
|
|
||||||
DB *db;
|
|
||||||
r = db_create(&db, env, 0); assert(r == 0);
|
|
||||||
if (IS_TDB) assert(dup_flags==0);
|
|
||||||
r = db->set_flags(db, dup_flags);
|
|
||||||
assert(r == 0);
|
|
||||||
uint32_t flags; r = db->get_flags(db, &flags); assert(r == 0); assert(flags == dup_flags);
|
|
||||||
if (IS_TDB) assert(dup_flags==0);
|
|
||||||
r = db->open(db, null_txn, fname, "main", DB_BTREE, DB_CREATE, 0666);
|
|
||||||
assert(r == 0);
|
|
||||||
r = db->close(db, 0); assert(r == 0);
|
|
||||||
|
|
||||||
/* verify dup flags match */
|
|
||||||
r = db_create(&db, env, 0); assert(r == 0);
|
|
||||||
r = db->open(db, null_txn, fname, "main", DB_BTREE, 0, 0666);
|
|
||||||
if (r == 0 && verbose)
|
|
||||||
printf("%s:%d: WARNING:open ok:dup_mode:%u\n", __FILE__, __LINE__, dup_flags);
|
|
||||||
r = db->close(db, 0); assert(r == 0);
|
|
||||||
|
|
||||||
r = db_create(&db, env, 0); assert(r == 0);
|
|
||||||
r = db->set_flags(db, dup_flags); assert(r == 0);
|
|
||||||
r = db->open(db, null_txn, fname, "main", DB_BTREE, 0, 0666); assert(r == 0);
|
|
||||||
r = db->close(db, 0); assert(r == 0);
|
|
||||||
|
|
||||||
/* verify nodesize match */
|
|
||||||
r = db_create(&db, env, 0); assert(r == 0);
|
|
||||||
r = db->set_flags(db, dup_flags); assert(r == 0);
|
|
||||||
r = db->set_pagesize(db, 4096); assert(r == 0);
|
|
||||||
r = db->open(db, null_txn, fname, "main", DB_BTREE, 0, 0666); assert(r == 0);
|
|
||||||
r = db->close(db, 0); assert(r == 0);
|
|
||||||
r = env->close(env, 0); assert(r == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
test_main(int argc, char *const argv[]) {
|
|
||||||
|
|
||||||
parse_args(argc, argv);
|
|
||||||
|
|
||||||
int r;
|
|
||||||
r = system("rm -rf " ENVDIR);
|
|
||||||
CKERR(r);
|
|
||||||
toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO);
|
|
||||||
|
|
||||||
/* test flags */
|
|
||||||
test_dup_flags(0);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue