diff options
author | Pieter Wuille <pieter.wuille@gmail.com> | 2012-09-04 18:12:00 +0200 |
---|---|---|
committer | Pieter Wuille <pieter.wuille@gmail.com> | 2012-10-20 23:08:57 +0200 |
commit | e1bfbab8029c33102889d7d970da5b6cc32ff75b (patch) | |
tree | c96ed4dca6cbca2791096fe95e2e866c06016a6a | |
parent | 2d8a48292b0da96cda8d7b45a24a22adfb4667b2 (diff) |
Add LevelDB MemEnv support
Support LevelDB memory-backed environments, and use them in unit tests.
-rw-r--r-- | src/init.cpp | 2 | ||||
-rw-r--r-- | src/leveldb.cpp | 12 | ||||
-rw-r--r-- | src/leveldb.h | 2 | ||||
-rw-r--r-- | src/test/test_bitcoin.cpp | 8 | ||||
-rw-r--r-- | src/txdb-bdb.cpp | 2 | ||||
-rw-r--r-- | src/txdb-bdb.h | 4 | ||||
-rw-r--r-- | src/txdb-leveldb.cpp | 5 | ||||
-rw-r--r-- | src/txdb-leveldb.h | 4 |
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&); |