// fcreate, fdelete, fcreate after a checkpoint #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; char *namea="a.db"; char *nameb="b.db"; static void run_test (void) { int r; system("rm -rf " ENVDIR); toku_os_mkdir(ENVDIR, S_IRWXU+S_IRWXG+S_IRWXO); DB_ENV *env; DB *db; r = db_env_create(&env, 0); CKERR(r); r = env->open(env, ENVDIR, envflags, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r); // checkpoint r = env->txn_checkpoint(env, 0, 0, 0); CKERR(r); // create r = db_create(&db, env, 0); CKERR(r); r = db->open(db, NULL, namea, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r); r = db->close(db, 0); CKERR(r); // delete r = db_create(&db, env, 0); CKERR(r); r = db->remove(db, namea, NULL, 0); CKERR(r); // create r = db_create(&db, env, 0); CKERR(r); r = db->set_flags(db, DB_DUPSORT); CKERR(r); r = db->open(db, NULL, namea, NULL, DB_BTREE, DB_AUTO_COMMIT|DB_CREATE, 0666); CKERR(r); r = db->close(db, 0); CKERR(r); abort(); } 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); u_int32_t dbflags; DB *db; r = db_create(&db, env, 0); CKERR(r); r = db->open(db, NULL, namea, NULL, DB_UNKNOWN, DB_AUTO_COMMIT, 0666); CKERR(r); r = db->get_flags(db, &dbflags); CKERR(r); assert(dbflags == DB_DUPSORT); r = db->close(db, 0); CKERR(r); r = env->close(env, 0); CKERR(r); exit(0); } 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); 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 *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 *argv[]) { test_parse_args(argc, argv); if (do_test) { run_test(); } else if (do_recover) { run_recover(); } else if (do_recover_only) { run_recover_only(); } else if (do_no_recover) { run_no_recover(); } return 0; }