Skip to content

Commit

Permalink
Refactor: Move m_db pointers into BerkeleyDatabase
Browse files Browse the repository at this point in the history
This is a refactoring change that doesn't affect behavior. The motivation
behind the change is give BerkeleyEnvironment objects access to
BerkeleyDatabase objects so it will be possible to simplify the duplicate
wallet check and more reliably avoid opening the same databases twice.
  • Loading branch information
ryanofsky authored and ken2812221 committed Nov 6, 2018
1 parent 76ae7a1 commit c456fbd
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 14 deletions.
27 changes: 14 additions & 13 deletions src/wallet/db.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,13 @@ void BerkeleyEnvironment::Close()

fDbEnvInit = false;

for (auto& db : mapDb) {
for (auto& db : m_databases) {
auto count = mapFileUseCount.find(db.first);
assert(count == mapFileUseCount.end() || count->second == 0);
if (db.second) {
db.second->close(0);
delete db.second;
db.second = nullptr;
BerkeleyDatabase& database = db.second.get();
if (database.m_db) {
database.m_db->close(0);
database.m_db.reset();
}
}

Expand Down Expand Up @@ -463,7 +463,7 @@ BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode, bo
if (!env->Open(false /* retry */))
throw std::runtime_error("BerkeleyBatch: Failed to open database environment.");

pdb = env->mapDb[strFilename];
pdb = database.m_db.get();
if (pdb == nullptr) {
int ret;
std::unique_ptr<Db> pdb_temp = MakeUnique<Db>(env->dbenv.get(), 0);
Expand Down Expand Up @@ -508,7 +508,7 @@ BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode, bo
}

pdb = pdb_temp.release();
env->mapDb[strFilename] = pdb;
database.m_db.reset(pdb);

if (fCreate && !Exists(std::string("version"))) {
bool fTmp = fReadOnly;
Expand Down Expand Up @@ -563,12 +563,13 @@ void BerkeleyEnvironment::CloseDb(const std::string& strFile)
{
{
LOCK(cs_db);
if (mapDb[strFile] != nullptr) {
auto it = m_databases.find(strFile);
assert(it != m_databases.end());
BerkeleyDatabase& database = it->second.get();
if (database.m_db) {
// Close the database handle
Db* pdb = mapDb[strFile];
pdb->close(0);
delete pdb;
mapDb[strFile] = nullptr;
database.m_db->close(0);
database.m_db.reset();
}
}
}
Expand All @@ -586,7 +587,7 @@ void BerkeleyEnvironment::ReloadDbEnv()
});

std::vector<std::string> filenames;
for (auto it : mapDb) {
for (auto it : m_databases) {
filenames.push_back(it.first);
}
// Close the individual Db's
Expand Down
16 changes: 15 additions & 1 deletion src/wallet/db.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ struct WalletDatabaseFileId {
bool operator==(const WalletDatabaseFileId& rhs) const;
};

class BerkeleyDatabase;

class BerkeleyEnvironment
{
private:
Expand All @@ -43,7 +45,7 @@ class BerkeleyEnvironment
public:
std::unique_ptr<DbEnv> dbenv;
std::map<std::string, int> mapFileUseCount;
std::map<std::string, Db*> mapDb;
std::map<std::string, std::reference_wrapper<BerkeleyDatabase>> m_databases;
std::unordered_map<std::string, WalletDatabaseFileId> m_fileids;
std::condition_variable_any m_db_in_use;

Expand Down Expand Up @@ -115,13 +117,22 @@ class BerkeleyDatabase
nUpdateCounter(0), nLastSeen(0), nLastFlushed(0), nLastWalletUpdate(0)
{
env = GetWalletEnv(wallet_path, strFile);
auto inserted = env->m_databases.emplace(strFile, std::ref(*this));
assert(inserted.second);
if (mock) {
env->Close();
env->Reset();
env->MakeMock();
}
}

~BerkeleyDatabase() {
if (env) {
size_t erased = env->m_databases.erase(strFile);
assert(erased == 1);
}
}

/** Return object for accessing database at specified path. */
static std::unique_ptr<BerkeleyDatabase> Create(const fs::path& path)
{
Expand Down Expand Up @@ -161,6 +172,9 @@ class BerkeleyDatabase
unsigned int nLastFlushed;
int64_t nLastWalletUpdate;

/** Database pointer. This is initialized lazily and reset during flushes, so it can be null. */
std::unique_ptr<Db> m_db;

private:
/** BerkeleyDB specific */
BerkeleyEnvironment *env;
Expand Down

0 comments on commit c456fbd

Please sign in to comment.