Run BDB disk-less for test_bitcoin

This commit is contained in:
Luke Dashjr 2012-05-22 19:51:13 +00:00
parent fbf99a9cdc
commit 148e107da6
3 changed files with 60 additions and 4 deletions

View File

@ -42,7 +42,8 @@ void CDBEnv::EnvShutdown()
{ {
printf("EnvShutdown exception: %s (%d)\n", e.what(), e.get_errno()); printf("EnvShutdown exception: %s (%d)\n", e.what(), e.get_errno());
} }
DbEnv(0).remove(GetDataDir().string().c_str(), 0); if (!fMockDb)
DbEnv(0).remove(GetDataDir().string().c_str(), 0);
} }
CDBEnv::CDBEnv() : dbenv(0) CDBEnv::CDBEnv() : dbenv(0)
@ -103,12 +104,48 @@ bool CDBEnv::Open(boost::filesystem::path pathEnv_)
return error("CDB() : error %d opening database environment", ret); return error("CDB() : error %d opening database environment", ret);
fDbEnvInit = true; fDbEnvInit = true;
fMockDb = false;
return true; return true;
} }
void CDBEnv::MakeMock()
{
if (fDbEnvInit)
throw runtime_error("CDBEnv::MakeMock(): already initialized");
if (fShutdown)
throw runtime_error("CDBEnv::MakeMock(): during shutdown");
printf("CDBEnv::MakeMock()\n");
dbenv.set_cachesize(1, 0, 1);
dbenv.set_lg_bsize(10485760*4);
dbenv.set_lg_max(10485760);
dbenv.set_lk_max_locks(10000);
dbenv.set_lk_max_objects(10000);
dbenv.set_flags(DB_AUTO_COMMIT, 1);
dbenv.log_set_config(DB_LOG_IN_MEMORY, 1);
int ret = dbenv.open(NULL,
DB_CREATE |
DB_INIT_LOCK |
DB_INIT_LOG |
DB_INIT_MPOOL |
DB_INIT_TXN |
DB_THREAD |
DB_PRIVATE,
S_IRUSR | S_IWUSR);
if (ret > 0)
throw runtime_error(strprintf("CDBEnv::MakeMock(): error %d opening database environment", ret));
fDbEnvInit = true;
fMockDb = true;
}
void CDBEnv::CheckpointLSN(std::string strFile) void CDBEnv::CheckpointLSN(std::string strFile)
{ {
dbenv.txn_checkpoint(0, 0, 0); dbenv.txn_checkpoint(0, 0, 0);
if (fMockDb)
return;
dbenv.lsn_reset(strFile.c_str(), 0); dbenv.lsn_reset(strFile.c_str(), 0);
} }
@ -138,8 +175,17 @@ CDB::CDB(const char *pszFile, const char* pszMode) :
{ {
pdb = new Db(&bitdb.dbenv, 0); pdb = new Db(&bitdb.dbenv, 0);
bool fMockDb = bitdb.IsMock();
if (fMockDb)
{
DbMpoolFile*mpf = pdb->get_mpf();
ret = mpf->set_flags(DB_MPOOL_NOFILE, 1);
if (ret != 0)
throw runtime_error(strprintf("CDB() : failed to configure for no temp file backing for database %s", pszFile));
}
ret = pdb->open(NULL, // Txn pointer ret = pdb->open(NULL, // Txn pointer
pszFile, // Filename fMockDb ? NULL : pszFile, // Filename
"main", // Logical db name "main", // Logical db name
DB_BTREE, // Database type DB_BTREE, // Database type
nFlags, // Flags nFlags, // Flags
@ -337,7 +383,8 @@ void CDBEnv::Flush(bool fShutdown)
dbenv.txn_checkpoint(0, 0, 0); dbenv.txn_checkpoint(0, 0, 0);
if (!IsChainFile(strFile) || fDetachDB) { if (!IsChainFile(strFile) || fDetachDB) {
printf("%s detach\n", strFile.c_str()); printf("%s detach\n", strFile.c_str());
dbenv.lsn_reset(strFile.c_str(), 0); if (!fMockDb)
dbenv.lsn_reset(strFile.c_str(), 0);
} }
printf("%s closed\n", strFile.c_str()); printf("%s closed\n", strFile.c_str());
mapFileUseCount.erase(mi++); mapFileUseCount.erase(mi++);

View File

@ -35,6 +35,7 @@ class CDBEnv
private: private:
bool fDetachDB; bool fDetachDB;
bool fDbEnvInit; bool fDbEnvInit;
bool fMockDb;
boost::filesystem::path pathEnv; boost::filesystem::path pathEnv;
void EnvShutdown(); void EnvShutdown();
@ -47,6 +48,8 @@ public:
CDBEnv(); CDBEnv();
~CDBEnv(); ~CDBEnv();
void MakeMock();
bool IsMock() { return fMockDb; };
bool Open(boost::filesystem::path pathEnv_); bool Open(boost::filesystem::path pathEnv_);
void Close(); void Close();
void Flush(bool fShutdown); void Flush(bool fShutdown);

View File

@ -1,6 +1,7 @@
#define BOOST_TEST_MODULE Bitcoin Test Suite #define BOOST_TEST_MODULE Bitcoin Test Suite
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
#include "db.h"
#include "main.h" #include "main.h"
#include "wallet.h" #include "wallet.h"
@ -14,13 +15,18 @@ struct TestingSetup {
TestingSetup() { TestingSetup() {
fPrintToConsole = true; // don't want to write to debug.log file fPrintToConsole = true; // don't want to write to debug.log file
noui_connect(); noui_connect();
pwalletMain = new CWallet(); bitdb.MakeMock();
LoadBlockIndex(true);
bool fFirstRun;
pwalletMain = new CWallet("wallet.dat");
pwalletMain->LoadWallet(fFirstRun);
RegisterWallet(pwalletMain); RegisterWallet(pwalletMain);
} }
~TestingSetup() ~TestingSetup()
{ {
delete pwalletMain; delete pwalletMain;
pwalletMain = NULL; pwalletMain = NULL;
bitdb.Flush(true);
} }
}; };