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&);