aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2012-09-04 18:12:00 +0200
committerPieter Wuille <pieter.wuille@gmail.com>2012-10-20 23:08:57 +0200
commite1bfbab8029c33102889d7d970da5b6cc32ff75b (patch)
treec96ed4dca6cbca2791096fe95e2e866c06016a6a
parent2d8a48292b0da96cda8d7b45a24a22adfb4667b2 (diff)
Add LevelDB MemEnv support
Support LevelDB memory-backed environments, and use them in unit tests.
-rw-r--r--src/init.cpp2
-rw-r--r--src/leveldb.cpp12
-rw-r--r--src/leveldb.h2
-rw-r--r--src/test/test_bitcoin.cpp8
-rw-r--r--src/txdb-bdb.cpp2
-rw-r--r--src/txdb-bdb.h4
-rw-r--r--src/txdb-leveldb.cpp5
-rw-r--r--src/txdb-leveldb.h4
8 files changed, 27 insertions, 12 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 30f0d0049e..4d5720306d 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -652,7 +652,7 @@ bool AppInit2()
uiInterface.InitMessage(_("Loading block index..."));
printf("Loading block index...\n");
nStart = GetTimeMillis();
- pblocktree = new CBlockTreeDB("cr+");
+ pblocktree = new CBlockTreeDB();
pcoinsdbview = new CCoinsViewDB();
pcoinsTip = new CCoinsViewCache(*pcoinsdbview);
diff --git a/src/leveldb.cpp b/src/leveldb.cpp
index 29e5e6a7fd..e8a0fbe874 100644
--- a/src/leveldb.cpp
+++ b/src/leveldb.cpp
@@ -8,6 +8,7 @@
#include <leveldb/env.h>
#include <leveldb/cache.h>
#include <leveldb/filter_policy.h>
+#include <memenv/memenv.h>
#include <boost/filesystem.hpp>
@@ -20,7 +21,7 @@ static leveldb::Options GetOptions() {
return options;
}
-CLevelDB::CLevelDB(const boost::filesystem::path &path) {
+CLevelDB::CLevelDB(const boost::filesystem::path &path, bool fMemory) {
penv = NULL;
readoptions.verify_checksums = true;
iteroptions.verify_checksums = true;
@@ -28,8 +29,13 @@ CLevelDB::CLevelDB(const boost::filesystem::path &path) {
syncoptions.sync = true;
options = GetOptions();
options.create_if_missing = true;
- boost::filesystem::create_directory(path);
- printf("Opening LevelDB in %s\n", path.string().c_str());
+ if (fMemory) {
+ penv = leveldb::NewMemEnv(leveldb::Env::Default());
+ options.env = penv;
+ } else {
+ boost::filesystem::create_directory(path);
+ printf("Opening LevelDB in %s\n", path.string().c_str());
+ }
leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb);
if (!status.ok())
throw std::runtime_error(strprintf("CLevelDB(): error opening database environment %s", status.ToString().c_str()));
diff --git a/src/leveldb.h b/src/leveldb.h
index 28484dac9d..ee9079c3c3 100644
--- a/src/leveldb.h
+++ b/src/leveldb.h
@@ -69,7 +69,7 @@ private:
leveldb::DB *pdb;
public:
- CLevelDB(const boost::filesystem::path &path);
+ CLevelDB(const boost::filesystem::path &path, bool fMemory = false);
~CLevelDB();
template<typename K, typename V> bool Read(const K& key, V& value) {
diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp
index 4580877cd8..0173c0064b 100644
--- a/src/test/test_bitcoin.cpp
+++ b/src/test/test_bitcoin.cpp
@@ -2,6 +2,7 @@
#include <boost/test/unit_test.hpp>
#include "db.h"
+#include "txdb.h"
#include "main.h"
#include "wallet.h"
@@ -18,8 +19,13 @@ struct TestingSetup {
fPrintToDebugger = true; // don't want to write to debug.log file
noui_connect();
bitdb.MakeMock();
- pblocktree = new CBlockTreeDB("cr+");
+#ifdef USE_LEVELDB
+ pblocktree = new CBlockTreeDB(true);
+ pcoinsdbview = new CCoinsViewDB(true);
+#else
+ pblocktree = new CBlockTreeDB();
pcoinsdbview = new CCoinsViewDB();
+#endif
pcoinsTip = new CCoinsViewCache(*pcoinsdbview);
LoadBlockIndex(true);
bool fFirstRun;
diff --git a/src/txdb-bdb.cpp b/src/txdb-bdb.cpp
index 5e46096646..8954b8b30a 100644
--- a/src/txdb-bdb.cpp
+++ b/src/txdb-bdb.cpp
@@ -64,7 +64,7 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
return Read('l', nFile);
}
-CCoinsViewDB::CCoinsViewDB() : db("cr+") {}
+CCoinsViewDB::CCoinsViewDB() : db() {}
bool CCoinsViewDB::GetCoins(uint256 txid, CCoins &coins) { return db.ReadCoins(txid, coins); }
bool CCoinsViewDB::SetCoins(uint256 txid, const CCoins &coins) { return db.WriteCoins(txid, coins); }
bool CCoinsViewDB::HaveCoins(uint256 txid) { return db.HaveCoins(txid); }
diff --git a/src/txdb-bdb.h b/src/txdb-bdb.h
index d61e95bac2..3e8d40c274 100644
--- a/src/txdb-bdb.h
+++ b/src/txdb-bdb.h
@@ -11,7 +11,7 @@
class CCoinsDB : public CDB
{
public:
- CCoinsDB(const char* pszMode="r+") : CDB("coins.dat", pszMode) { }
+ CCoinsDB() : CDB("coins.dat", "cr+") { }
private:
CCoinsDB(const CCoinsDB&);
void operator=(const CCoinsDB&);
@@ -43,7 +43,7 @@ public:
class CBlockTreeDB : public CDB
{
public:
- CBlockTreeDB(const char* pszMode="r+") : CDB("blktree.dat", pszMode) { }
+ CBlockTreeDB() : CDB("blktree.dat", "cr+") { }
private:
CBlockTreeDB(const CBlockTreeDB&);
void operator=(const CBlockTreeDB&);
diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp
index 83a71c97d2..4e2abe63d7 100644
--- a/src/txdb-leveldb.cpp
+++ b/src/txdb-leveldb.cpp
@@ -19,7 +19,7 @@ void static BatchWriteHashBestChain(CLevelDBBatch &batch, const uint256 &hash) {
batch.Write('B', hash);
}
-CCoinsViewDB::CCoinsViewDB() : db(GetDataDir() / "coins") {
+CCoinsViewDB::CCoinsViewDB(bool fMemory) : db(GetDataDir() / "coins", fMemory) {
}
bool CCoinsViewDB::GetCoins(uint256 txid, CCoins &coins) {
@@ -63,6 +63,9 @@ bool CCoinsViewDB::BatchWrite(const std::map<uint256, CCoins> &mapCoins, CBlockI
return db.WriteBatch(batch);
}
+CBlockTreeDB::CBlockTreeDB(bool fMemory) : CLevelDB(GetDataDir() / "blktree", fMemory) {
+}
+
bool CBlockTreeDB::WriteBlockIndex(const CDiskBlockIndex& blockindex)
{
return Write(make_pair('b', blockindex.GetBlockHash()), blockindex);
diff --git a/src/txdb-leveldb.h b/src/txdb-leveldb.h
index e66ba8f8a0..1254422cf0 100644
--- a/src/txdb-leveldb.h
+++ b/src/txdb-leveldb.h
@@ -14,7 +14,7 @@ class CCoinsViewDB : public CCoinsView
protected:
CLevelDB db;
public:
- CCoinsViewDB();
+ CCoinsViewDB(bool fMemory = false);
bool GetCoins(uint256 txid, CCoins &coins);
bool SetCoins(uint256 txid, const CCoins &coins);
@@ -28,7 +28,7 @@ public:
class CBlockTreeDB : public CLevelDB
{
public:
- CBlockTreeDB(const char* pszMode="r+") : CLevelDB(GetDataDir() / "blktree") { }
+ CBlockTreeDB(bool fMemory = false);
private:
CBlockTreeDB(const CBlockTreeDB&);
void operator=(const CBlockTreeDB&);