changeset 3194:bba71ed03345 draft

Run BDB disk-less for test_bitcoin
author Luke Dashjr <luke-jr+git@utopios.org>
date Tue, 22 May 2012 19:51:13 +0000
parents 6d470300b634
children d56076da56fc
files src/db.cpp src/db.h src/test/test_bitcoin.cpp
diffstat 3 files changed, 60 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -42,7 +42,8 @@
     {
         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 @@
         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 @@
         {
             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 @@
                 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++);
--- a/src/db.h
+++ b/src/db.h
@@ -35,6 +35,7 @@
 private:
     bool fDetachDB;
     bool fDbEnvInit;
+    bool fMockDb;
     boost::filesystem::path pathEnv;
 
     void EnvShutdown();
@@ -47,6 +48,8 @@
 
     CDBEnv();
     ~CDBEnv();
+    void MakeMock();
+    bool IsMock() { return fMockDb; };
     bool Open(boost::filesystem::path pathEnv_);
     void Close();
     void Flush(bool fShutdown);
--- 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 @@
     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);
     }
 };