Browse Source

Further CDBEnv encapsulation work.

0.8
Jeff Garzik 13 years ago committed by Jeff Garzik
parent
commit
ffe8b77a61
  1. 24
      src/db.cpp
  2. 4
      src/db.h
  3. 21
      src/walletdb.cpp

24
src/db.cpp

@ -27,8 +27,6 @@ unsigned int nWalletDBUpdated;
// //
CDBEnv bitdb; CDBEnv bitdb;
map<string, int> mapFileUseCount;
static map<string, Db*> mapDb;
void CDBEnv::EnvShutdown() void CDBEnv::EnvShutdown()
{ {
@ -129,8 +127,8 @@ CDB::CDB(const char *pszFile, const char* pszMode) :
throw runtime_error("env open failed"); throw runtime_error("env open failed");
strFile = pszFile; strFile = pszFile;
++mapFileUseCount[strFile]; ++bitdb.mapFileUseCount[strFile];
pdb = mapDb[strFile]; pdb = bitdb.mapDb[strFile];
if (pdb == NULL) if (pdb == NULL)
{ {
pdb = new Db(&bitdb.dbenv, 0); pdb = new Db(&bitdb.dbenv, 0);
@ -148,7 +146,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) :
pdb = NULL; pdb = NULL;
{ {
LOCK(bitdb.cs_db); LOCK(bitdb.cs_db);
--mapFileUseCount[strFile]; --bitdb.mapFileUseCount[strFile];
} }
strFile = ""; strFile = "";
throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret)); throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret));
@ -162,7 +160,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) :
fReadOnly = fTmp; fReadOnly = fTmp;
} }
mapDb[strFile] = pdb; bitdb.mapDb[strFile] = pdb;
} }
} }
} }
@ -189,14 +187,14 @@ void CDB::Close()
{ {
LOCK(bitdb.cs_db); LOCK(bitdb.cs_db);
--mapFileUseCount[strFile]; --bitdb.mapFileUseCount[strFile];
} }
} }
void CloseDb(const string& strFile) void CDBEnv::CloseDb(const string& strFile)
{ {
{ {
LOCK(bitdb.cs_db); LOCK(cs_db);
if (mapDb[strFile] != NULL) if (mapDb[strFile] != NULL)
{ {
// Close the database handle // Close the database handle
@ -214,12 +212,12 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
{ {
{ {
LOCK(bitdb.cs_db); LOCK(bitdb.cs_db);
if (!mapFileUseCount.count(strFile) || mapFileUseCount[strFile] == 0) if (!bitdb.mapFileUseCount.count(strFile) || bitdb.mapFileUseCount[strFile] == 0)
{ {
// Flush log data to the dat file // Flush log data to the dat file
CloseDb(strFile); bitdb.CloseDb(strFile);
bitdb.CheckpointLSN(strFile); bitdb.CheckpointLSN(strFile);
mapFileUseCount.erase(strFile); bitdb.mapFileUseCount.erase(strFile);
bool fSuccess = true; bool fSuccess = true;
printf("Rewriting %s...\n", strFile.c_str()); printf("Rewriting %s...\n", strFile.c_str());
@ -276,7 +274,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip)
if (fSuccess) if (fSuccess)
{ {
db.Close(); db.Close();
CloseDb(strFile); bitdb.CloseDb(strFile);
if (pdbCopy->close(0)) if (pdbCopy->close(0))
fSuccess = false; fSuccess = false;
delete pdbCopy; delete pdbCopy;

4
src/db.h

@ -42,6 +42,8 @@ private:
public: public:
mutable CCriticalSection cs_db; mutable CCriticalSection cs_db;
DbEnv dbenv; DbEnv dbenv;
std::map<std::string, int> mapFileUseCount;
std::map<std::string, Db*> mapDb;
CDBEnv(); CDBEnv();
~CDBEnv(); ~CDBEnv();
@ -51,6 +53,8 @@ public:
void CheckpointLSN(std::string strFile); void CheckpointLSN(std::string strFile);
void SetDetach(bool fDetachDB_) { fDetachDB = fDetachDB_; } void SetDetach(bool fDetachDB_) { fDetachDB = fDetachDB_; }
void CloseDb(const std::string& strFile);
DbTxn *TxnBegin(int flags=DB_TXN_WRITE_NOSYNC) DbTxn *TxnBegin(int flags=DB_TXN_WRITE_NOSYNC)
{ {
DbTxn* ptxn = NULL; DbTxn* ptxn = NULL;

21
src/walletdb.cpp

@ -13,9 +13,6 @@ using namespace boost;
static uint64 nAccountingEntryNumber = 0; static uint64 nAccountingEntryNumber = 0;
extern map<string, int> mapFileUseCount;
extern void CloseDb(const string& strFile);
// //
// CWalletDB // CWalletDB
// //
@ -354,8 +351,8 @@ void ThreadFlushWalletDB(void* parg)
{ {
// Don't do this if any databases are in use // Don't do this if any databases are in use
int nRefCount = 0; int nRefCount = 0;
map<string, int>::iterator mi = mapFileUseCount.begin(); map<string, int>::iterator mi = bitdb.mapFileUseCount.begin();
while (mi != mapFileUseCount.end()) while (mi != bitdb.mapFileUseCount.end())
{ {
nRefCount += (*mi).second; nRefCount += (*mi).second;
mi++; mi++;
@ -363,18 +360,18 @@ void ThreadFlushWalletDB(void* parg)
if (nRefCount == 0 && !fShutdown) if (nRefCount == 0 && !fShutdown)
{ {
map<string, int>::iterator mi = mapFileUseCount.find(strFile); map<string, int>::iterator mi = bitdb.mapFileUseCount.find(strFile);
if (mi != mapFileUseCount.end()) if (mi != bitdb.mapFileUseCount.end())
{ {
printf("Flushing wallet.dat\n"); printf("Flushing wallet.dat\n");
nLastFlushed = nWalletDBUpdated; nLastFlushed = nWalletDBUpdated;
int64 nStart = GetTimeMillis(); int64 nStart = GetTimeMillis();
// Flush wallet.dat so it's self contained // Flush wallet.dat so it's self contained
CloseDb(strFile); bitdb.CloseDb(strFile);
bitdb.CheckpointLSN(strFile); bitdb.CheckpointLSN(strFile);
mapFileUseCount.erase(mi++); bitdb.mapFileUseCount.erase(mi++);
printf("Flushed wallet.dat %"PRI64d"ms\n", GetTimeMillis() - nStart); printf("Flushed wallet.dat %"PRI64d"ms\n", GetTimeMillis() - nStart);
} }
} }
@ -391,12 +388,12 @@ bool BackupWallet(const CWallet& wallet, const string& strDest)
{ {
{ {
LOCK(bitdb.cs_db); LOCK(bitdb.cs_db);
if (!mapFileUseCount.count(wallet.strWalletFile) || mapFileUseCount[wallet.strWalletFile] == 0) if (!bitdb.mapFileUseCount.count(wallet.strWalletFile) || bitdb.mapFileUseCount[wallet.strWalletFile] == 0)
{ {
// Flush log data to the dat file // Flush log data to the dat file
CloseDb(wallet.strWalletFile); bitdb.CloseDb(wallet.strWalletFile);
bitdb.CheckpointLSN(wallet.strWalletFile); bitdb.CheckpointLSN(wallet.strWalletFile);
mapFileUseCount.erase(wallet.strWalletFile); bitdb.mapFileUseCount.erase(wallet.strWalletFile);
// Copy wallet.dat // Copy wallet.dat
filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile; filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;

Loading…
Cancel
Save