Mercurial > hg > bitcoin
changeset 3658:420276fb84b6 draft
Add LevelDB MemEnv support
Support LevelDB memory-backed environments, and use them in unit tests.
author | Pieter Wuille <pieter.wuille@gmail.com> |
---|---|
date | Tue, 04 Sep 2012 18:12:00 +0200 |
parents | 526ec2f104b0 |
children | 7c2963c3101d |
files | src/init.cpp src/leveldb.cpp src/leveldb.h src/test/test_bitcoin.cpp src/txdb-bdb.cpp src/txdb-bdb.h src/txdb-leveldb.cpp src/txdb-leveldb.h |
diffstat | 8 files changed, 27 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/init.cpp +++ b/src/init.cpp @@ -652,7 +652,7 @@ 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);
--- 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 @@ 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 @@ 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()));
--- a/src/leveldb.h +++ b/src/leveldb.h @@ -69,7 +69,7 @@ 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) {
--- 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 @@ 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;
--- a/src/txdb-bdb.cpp +++ b/src/txdb-bdb.cpp @@ -64,7 +64,7 @@ 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); }
--- 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 @@ 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&);
--- a/src/txdb-leveldb.cpp +++ b/src/txdb-leveldb.cpp @@ -19,7 +19,7 @@ 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 @@ 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);
--- a/src/txdb-leveldb.h +++ b/src/txdb-leveldb.h @@ -14,7 +14,7 @@ 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 @@ 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&);