aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuke Dashjr <luke-jr+git@utopios.org>2012-05-22 19:51:13 +0000
committerLuke Dashjr <luke-jr+git@utopios.org>2012-07-11 04:26:44 +0000
commit148e107da6f3e0f477e773cc3a3cb882ff53dab4 (patch)
tree6ca8d32346ca827c06b90475c27ae0f31dde970c /src
parentfbf99a9cdc3293b05ccc18c2f2dc6ae45da4258c (diff)
downloadbitcoin-148e107da6f3e0f477e773cc3a3cb882ff53dab4.tar.xz
Run BDB disk-less for test_bitcoin
Diffstat (limited to 'src')
-rw-r--r--src/db.cpp53
-rw-r--r--src/db.h3
-rw-r--r--src/test/test_bitcoin.cpp8
3 files changed, 60 insertions, 4 deletions
diff --git a/src/db.cpp b/src/db.cpp
index e494d28e3c..5671993d37 100644
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -42,7 +42,8 @@ void CDBEnv::EnvShutdown()
{
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)
@@ -103,12 +104,48 @@ bool CDBEnv::Open(boost::filesystem::path pathEnv_)
return error("CDB() : error %d opening database environment", ret);
fDbEnvInit = true;
+ fMockDb = false;
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)
{
dbenv.txn_checkpoint(0, 0, 0);
+ if (fMockDb)
+ return;
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);
+ 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
- pszFile, // Filename
+ fMockDb ? NULL : pszFile, // Filename
"main", // Logical db name
DB_BTREE, // Database type
nFlags, // Flags
@@ -337,7 +383,8 @@ void CDBEnv::Flush(bool fShutdown)
dbenv.txn_checkpoint(0, 0, 0);
if (!IsChainFile(strFile) || fDetachDB) {
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());
mapFileUseCount.erase(mi++);
diff --git a/src/db.h b/src/db.h
index 1030a40c48..4a08bf10a1 100644
--- a/src/db.h
+++ b/src/db.h
@@ -35,6 +35,7 @@ class CDBEnv
private:
bool fDetachDB;
bool fDbEnvInit;
+ bool fMockDb;
boost::filesystem::path pathEnv;
void EnvShutdown();
@@ -47,6 +48,8 @@ public:
CDBEnv();
~CDBEnv();
+ void MakeMock();
+ bool IsMock() { return fMockDb; };
bool Open(boost::filesystem::path pathEnv_);
void Close();
void Flush(bool fShutdown);
diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp
index 96d63bff97..cae0bb6baf 100644
--- a/src/test/test_bitcoin.cpp
+++ b/src/test/test_bitcoin.cpp
@@ -1,6 +1,7 @@
#define BOOST_TEST_MODULE Bitcoin Test Suite
#include <boost/test/unit_test.hpp>
+#include "db.h"
#include "main.h"
#include "wallet.h"
@@ -14,13 +15,18 @@ struct TestingSetup {
TestingSetup() {
fPrintToConsole = true; // don't want to write to debug.log file
noui_connect();
- pwalletMain = new CWallet();
+ bitdb.MakeMock();
+ LoadBlockIndex(true);
+ bool fFirstRun;
+ pwalletMain = new CWallet("wallet.dat");
+ pwalletMain->LoadWallet(fFirstRun);
RegisterWallet(pwalletMain);
}
~TestingSetup()
{
delete pwalletMain;
pwalletMain = NULL;
+ bitdb.Flush(true);
}
};