int TestLockMaxLocks(CuTest *ct) { DB_ENV *dbenv; u_int32_t v; dbenv = NULL; /* lk_max_locks: NOT reset at run-time. */ ENV CuAssertTrue(ct, dbenv->set_lk_max_locks(dbenv, 1037) == 0); CuAssertTrue(ct, dbenv->open(dbenv, TEST_ENV, DB_CREATE | DB_INIT_LOCK, 0666) == 0); CuAssertTrue(ct, dbenv->get_lk_max_locks(dbenv, &v) == 0); CuAssertTrue(ct, v == 1037); ENV CuAssertTrue(ct, dbenv->set_lk_max_locks(dbenv, 1063) == 0); CuAssertTrue(ct, dbenv->open(dbenv, TEST_ENV, DB_JOINENV, 0666) == 0); CuAssertTrue(ct, dbenv->get_lk_max_locks(dbenv, &v) == 0); CuAssertTrue(ct, v == 1037); return (0); }
/* * This should be done before the program is open for business. * As such, it does not need to be reentrant. */ int open_db_env(char *topdir) { DB_ENV *tmpenv = NULL; int st; struct stat64 sbuf; char logdir[MAXPATHLEN+1]; char tmpdir[MAXPATHLEN+1]; char *dirarr[3]; int i; if (topdir == NULL) { return (-1); } snprintf(logdir, sizeof (tmpdir), "%s/.logs", topdir); snprintf(tmpdir, sizeof (tmpdir), "%s/.tmp", topdir); dirarr[0] = topdir; dirarr[1] = logdir; dirarr[2] = tmpdir; /* first, set up the environment */ st = db_env_create(&tmpenv, 0); if (st != 0) { return (st); } /* make sure the directories exist */ for (i = 0; i < 3; i++) { st = stat64(dirarr[i], &sbuf); if ((st != 0) && (errno == ENOENT)) { st = mkdirp(dirarr[i], 0744); if (st == 0) { st = stat64(dirarr[i], &sbuf); } } if ((st == 0) && (!S_ISDIR(sbuf.st_mode))) { st = -1; break; } } if (st != 0) { return (st); } st = tmpenv->set_data_dir(tmpenv, topdir); if (st != 0) { return (st); } st = tmpenv->set_lg_dir(tmpenv, logdir); if (st != 0) { return (st); } st = tmpenv->set_tmp_dir(tmpenv, tmpdir); if (st != 0) { return (st); } st = tmpenv->set_flags(tmpenv, env_fl, 1); if (st != 0) { return (st); } /* overall database cache size */ st = tmpenv->set_cachesize(tmpenv, 0, (60 * MEGA), 1); st = tmpenv->set_shm_key(tmpenv, FSM_SHM_MASTER_KEY); if (st != 0) { return (st); } /* log buffer in memory */ st = tmpenv->set_lg_bsize(tmpenv, (30 * MEGA)); if (st != 0) { return (st); } /* set up additional error logging */ tmpenv->set_errcall(tmpenv, fsmdb_log_err); /* Increase the number of locks available */ tmpenv->set_lk_max_locks(tmpenv, 10000); tmpenv->set_lk_max_lockers(tmpenv, 10000); tmpenv->set_lk_max_objects(tmpenv, 10000); /* Increase the number of concurrent transactions available */ /* Note: Default in 4.4-20 is '20'. In later versions it's 100 */ tmpenv->set_tx_max(tmpenv, 100); st = tmpenv->open(tmpenv, topdir, env_ofl, 0644); if (st != 0) { /* check for a major failure */ if (st == DB_RUNRECOVERY) { st = tmpenv->open(tmpenv, topdir, env_ffl, 0644); } /* log catastrophic failure and remove all db files. */ if (st == DB_RUNRECOVERY) { fsmdb_log_err(dbEnv, NULL, "Database files corrupt, cannot recover. " "Files will be removed. Please re-index any " "recovery points to regenerate the database."); fsmdb_remove_all(topdir); } } if (st != 0) { return (st); } /* clear out unneeded log files */ tmpenv->log_archive(tmpenv, NULL, DB_ARCH_REMOVE); /* all set, ready to use */ dbEnv = tmpenv; return (st); }
int main() { const u_int8_t *lk_conflicts; DB_ENV *dbenv; db_timeout_t timeout; u_int32_t a, b, v; int lk_modes, ncache, nmodes; u_int8_t conflicts[40]; dbenv = NULL; /* tx_max: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_tx_max(dbenv, 37) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_TXN, 0666) == 0); assert(dbenv->get_tx_max(dbenv, &v) == 0); assert(v == 37); ENV assert(dbenv->set_tx_max(dbenv, 63) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_tx_max(dbenv, &v) == 0); assert(v == 37); /* lg_max: reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_lg_max(dbenv, 37 * 1024 * 1024) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOG, 0666) == 0); assert(dbenv->get_lg_max(dbenv, &v) == 0); assert(v == 37 * 1024 * 1024); ENV assert(dbenv->set_lg_max(dbenv, 63 * 1024 * 1024) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lg_max(dbenv, &v) == 0); assert(v == 63 * 1024 * 1024); /* lg_bsize: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_lg_bsize(dbenv, 37 * 1024) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOG, 0666) == 0); assert(dbenv->get_lg_bsize(dbenv, &v) == 0); assert(v == 37 * 1024); ENV assert(dbenv->set_lg_bsize(dbenv, 63 * 1024) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lg_bsize(dbenv, &v) == 0); assert(v == 37 * 1024); /* lg_regionmax: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_lg_regionmax(dbenv, 137 * 1024) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOG, 0666) == 0); assert(dbenv->get_lg_regionmax(dbenv, &v) == 0); assert(v == 137 * 1024); ENV assert(dbenv->set_lg_regionmax(dbenv, 163 * 1024) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lg_regionmax(dbenv, &v) == 0); assert(v == 137 * 1024); /* lk_get_lk_conflicts: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV memset(conflicts, 'a', sizeof(conflicts)); nmodes = 6; assert(dbenv->set_lk_conflicts(dbenv, conflicts, nmodes) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOCK, 0666) == 0); assert(dbenv->get_lk_conflicts(dbenv, &lk_conflicts, &lk_modes) == 0); assert(lk_conflicts[0] == 'a'); assert(lk_modes == 6); ENV memset(conflicts, 'b', sizeof(conflicts)); nmodes = 8; assert(dbenv->set_lk_conflicts(dbenv, conflicts, nmodes) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lk_conflicts(dbenv, &lk_conflicts, &lk_modes) == 0); assert(lk_conflicts[0] == 'a'); assert(lk_modes == 6); /* lk_detect: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_lk_detect(dbenv, DB_LOCK_MAXLOCKS) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOCK, 0666) == 0); assert(dbenv->get_lk_detect(dbenv, &v) == 0); assert(v == DB_LOCK_MAXLOCKS); ENV assert(dbenv->set_lk_detect(dbenv, DB_LOCK_DEFAULT) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lk_detect(dbenv, &v) == 0); assert(v == DB_LOCK_MAXLOCKS); /* lk_max_locks: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_lk_max_locks(dbenv, 37) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOCK, 0666) == 0); assert(dbenv->get_lk_max_locks(dbenv, &v) == 0); assert(v == 37); ENV assert(dbenv->set_lk_max_locks(dbenv, 63) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lk_max_locks(dbenv, &v) == 0); assert(v == 37); /* lk_max_lockers: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_lk_max_lockers(dbenv, 37) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOCK, 0666) == 0); assert(dbenv->get_lk_max_lockers(dbenv, &v) == 0); assert(v == 37); ENV assert(dbenv->set_lk_max_lockers(dbenv, 63) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lk_max_lockers(dbenv, &v) == 0); assert(v == 37); /* lk_max_objects: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_lk_max_objects(dbenv, 37) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOCK, 0666) == 0); assert(dbenv->get_lk_max_objects(dbenv, &v) == 0); assert(v == 37); ENV assert(dbenv->set_lk_max_objects(dbenv, 63) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_lk_max_objects(dbenv, &v) == 0); assert(v == 37); /* lock timeout: reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_timeout(dbenv, 37, DB_SET_LOCK_TIMEOUT) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOCK, 0666) == 0); assert(dbenv->get_timeout(dbenv, &timeout, DB_SET_LOCK_TIMEOUT) == 0); assert(timeout == 37); ENV assert(dbenv->set_timeout(dbenv, 63, DB_SET_LOCK_TIMEOUT) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_timeout(dbenv, &timeout, DB_SET_LOCK_TIMEOUT) == 0); assert(timeout == 63); /* txn timeout: reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_timeout(dbenv, 37, DB_SET_TXN_TIMEOUT) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_LOCK, 0666) == 0); assert(dbenv->get_timeout(dbenv, &timeout, DB_SET_TXN_TIMEOUT) == 0); assert(timeout == 37); ENV assert(dbenv->set_timeout(dbenv, 63, DB_SET_TXN_TIMEOUT) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_timeout(dbenv, &timeout, DB_SET_TXN_TIMEOUT) == 0); assert(timeout == 63); /* cache size: NOT reset at run-time. */ system("rm -rf TESTDIR; mkdir TESTDIR"); ENV assert(dbenv->set_cachesize(dbenv, 1, 131072, 3) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_CREATE | DB_INIT_MPOOL, 0666) == 0); assert(dbenv->get_cachesize(dbenv, &a, &b, &ncache) == 0); assert(dbenv->get_cachesize(dbenv, &a, &b, &ncache) == 0); assert(a == 1 && b == 131072 && ncache == 3); ENV assert(dbenv->set_cachesize(dbenv, 2, 262144, 1) == 0); assert(dbenv->open(dbenv, "TESTDIR", DB_JOINENV, 0666) == 0); assert(dbenv->get_cachesize(dbenv, &a, &b, &ncache) == 0); assert(a == 1 && b == 131072 && ncache == 3); return (0); }
int main(int argc, char **argv) { // Deal with command line arguments const char *path2DbEnv = 0; u_int32_t envFlags = (DB_CREATE|DB_PRIVATE|DB_INIT_MPOOL); u_int32_t txnEnvFlags = (DB_INIT_TXN|DB_INIT_LOCK|DB_INIT_LOG); u_int32_t dbxmlFlags = DBXML_ALLOW_EXTERNAL_ACCESS; vector<string> scripts; int verbose = 0; bool transactionMode = false; bool dbPrivate = false; bool envCreate = false; const char *progName = argv[0]; const char *password = 0; int cacheSize = 64; int ch; int ret = 0; while ((ch = getopt(argc, argv, "?h:hs:tvxVP:cz:")) != -1) { switch (ch) { case 'h': { path2DbEnv = optarg; break; } case 'z': { cacheSize = atoi(optarg); break; } case 'c': { envFlags &= ~DB_PRIVATE; envCreate = true; break; } case 'x': { dbxmlFlags &= ~DBXML_ALLOW_EXTERNAL_ACCESS; break; } case 't': { transactionMode = true; envFlags |= txnEnvFlags; break; } case 's': { scripts.push_back(optarg); break; } case 'v': { ++verbose; break; } case 'V': { printf("%s\n", DbXml::dbxml_version(NULL, NULL, NULL)); printf("%s\n", db_version(NULL, NULL, NULL)); exit(0); } case 'P': { password = optarg; break; } case '?': default: { usage(progName, 0); break; } } } // Turn on logging if extra verbose is specified if(verbose > 1) { setLogLevel(LEVEL_ALL, true); setLogCategory(CATEGORY_ALL, true); setLogCategory(CATEGORY_NODESTORE, verbose > 2); verboseErrors = true; } SigBlock sb; // block signals, resend at end of scope try { // Create a DB environment, and XmlManager DB_ENV *dbenv; int dberr = 0; dberr = db_env_create(&dbenv, 0); if (dberr) { cout << "Error creating environment: " << dberr << endl; exit(-1); } if (password) dbenv->set_encrypt(dbenv, password, DB_ENCRYPT_AES); dbenv->set_errcall(dbenv, errcall); dbenv->set_cachesize(dbenv, 0, cacheSize * 1024 * 1024, 1); dbenv->set_lk_max_lockers(dbenv, 10000); dbenv->set_lk_max_locks(dbenv, 10000); dbenv->set_lk_max_objects(dbenv, 10000); if (!dbPrivate) { dbenv->set_lk_detect(dbenv, DB_LOCK_DEFAULT); if (verbose && !envCreate) { cout << "Attempting to join environment: " << (path2DbEnv ? path2DbEnv : ".") << endl; } dberr = dbenv->open(dbenv, path2DbEnv, DB_USE_ENVIRON, 0); if (dberr != 0) { if (dberr == DB_VERSION_MISMATCH) { cerr << "Error opening environment " << (path2DbEnv ? path2DbEnv : ".") << ": " << "environment version mismatch" << endl; exit(-1); } if (verbose) { if(envCreate) { cerr << "Creating environment: " << (path2DbEnv ? path2DbEnv : ".") << endl; } else { cerr << "Unable to join environment " << (path2DbEnv ? path2DbEnv : ".") << ", creating a DB_PRIVATE environment" << endl; } } dberr = dbenv->open(dbenv, path2DbEnv, envFlags, 0); } else { cout << "Joined existing environment" << endl; u_int32_t eflags = 0; dbenv->get_open_flags(dbenv, &eflags); if (eflags & DB_INIT_TXN) transactionMode = true; else { if (verbose && (transactionMode == true)) cout << "Joined a non-transactional environment, turning off transaction mode" << endl; transactionMode = false; } } } else { dberr = dbenv->open(dbenv, path2DbEnv, envFlags, 0); } if (dberr != 0) { cerr << "Error opening environment " << (path2DbEnv ? path2DbEnv : ".") << ", error is " << dberr << endl; exit(-1); } XmlManager db(dbenv, dbxmlFlags|DBXML_ADOPT_DBENV); // Create the environment Environment env(db, sb); env.transactions() = transactionMode; // Create the Shell object DefaultShell shell; // Run scripts, if specified if(!scripts.empty()) { env.interactive() = false; env.verbose() = (verbose != 0); for(vector<string>::iterator i = scripts.begin(); i != scripts.end() && !env.quit(); ++i) { ifstream scriptFile(i->c_str(), ios::in); if(!scriptFile) { cerr << progName << ": cannot open script file: " << *i << endl; } else { env.streamName() = *i; env.lineNo() = 0; shell.mainLoop(scriptFile, env); scriptFile.close(); } } } // Perform the queries if(!env.quit()) { env.interactive() = true; env.verbose() = true; env.streamName() = "stdin"; env.lineNo() = 0; do { shell.mainLoop(cin, env); if(env.sigBlock().isInterrupted()) env.sigBlock().reset(); } while(!env.quit() && !cin.eof()); } } catch(exception &e) { cerr << progName << ": error at lowest level: " << e.what() << endl; ret = 1; } catch(...) { cerr << progName << ": error at lowest level: " << endl; ret = 1; } return ret; }