Skip to content

Commit c456fbd

Browse files
ryanofskyken2812221
authored andcommitted
Refactor: Move m_db pointers into BerkeleyDatabase
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.
1 parent 76ae7a1 commit c456fbd

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

src/wallet/db.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ void BerkeleyEnvironment::Close()
9090

9191
fDbEnvInit = false;
9292

93-
for (auto& db : mapDb) {
93+
for (auto& db : m_databases) {
9494
auto count = mapFileUseCount.find(db.first);
9595
assert(count == mapFileUseCount.end() || count->second == 0);
96-
if (db.second) {
97-
db.second->close(0);
98-
delete db.second;
99-
db.second = nullptr;
96+
BerkeleyDatabase& database = db.second.get();
97+
if (database.m_db) {
98+
database.m_db->close(0);
99+
database.m_db.reset();
100100
}
101101
}
102102

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

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

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

513513
if (fCreate && !Exists(std::string("version"))) {
514514
bool fTmp = fReadOnly;
@@ -563,12 +563,13 @@ void BerkeleyEnvironment::CloseDb(const std::string& strFile)
563563
{
564564
{
565565
LOCK(cs_db);
566-
if (mapDb[strFile] != nullptr) {
566+
auto it = m_databases.find(strFile);
567+
assert(it != m_databases.end());
568+
BerkeleyDatabase& database = it->second.get();
569+
if (database.m_db) {
567570
// Close the database handle
568-
Db* pdb = mapDb[strFile];
569-
pdb->close(0);
570-
delete pdb;
571-
mapDb[strFile] = nullptr;
571+
database.m_db->close(0);
572+
database.m_db.reset();
572573
}
573574
}
574575
}
@@ -586,7 +587,7 @@ void BerkeleyEnvironment::ReloadDbEnv()
586587
});
587588

588589
std::vector<std::string> filenames;
589-
for (auto it : mapDb) {
590+
for (auto it : m_databases) {
590591
filenames.push_back(it.first);
591592
}
592593
// Close the individual Db's

src/wallet/db.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ struct WalletDatabaseFileId {
3131
bool operator==(const WalletDatabaseFileId& rhs) const;
3232
};
3333

34+
class BerkeleyDatabase;
35+
3436
class BerkeleyEnvironment
3537
{
3638
private:
@@ -43,7 +45,7 @@ class BerkeleyEnvironment
4345
public:
4446
std::unique_ptr<DbEnv> dbenv;
4547
std::map<std::string, int> mapFileUseCount;
46-
std::map<std::string, Db*> mapDb;
48+
std::map<std::string, std::reference_wrapper<BerkeleyDatabase>> m_databases;
4749
std::unordered_map<std::string, WalletDatabaseFileId> m_fileids;
4850
std::condition_variable_any m_db_in_use;
4951

@@ -115,13 +117,22 @@ class BerkeleyDatabase
115117
nUpdateCounter(0), nLastSeen(0), nLastFlushed(0), nLastWalletUpdate(0)
116118
{
117119
env = GetWalletEnv(wallet_path, strFile);
120+
auto inserted = env->m_databases.emplace(strFile, std::ref(*this));
121+
assert(inserted.second);
118122
if (mock) {
119123
env->Close();
120124
env->Reset();
121125
env->MakeMock();
122126
}
123127
}
124128

129+
~BerkeleyDatabase() {
130+
if (env) {
131+
size_t erased = env->m_databases.erase(strFile);
132+
assert(erased == 1);
133+
}
134+
}
135+
125136
/** Return object for accessing database at specified path. */
126137
static std::unique_ptr<BerkeleyDatabase> Create(const fs::path& path)
127138
{
@@ -161,6 +172,9 @@ class BerkeleyDatabase
161172
unsigned int nLastFlushed;
162173
int64_t nLastWalletUpdate;
163174

175+
/** Database pointer. This is initialized lazily and reset during flushes, so it can be null. */
176+
std::unique_ptr<Db> m_db;
177+
164178
private:
165179
/** BerkeleyDB specific */
166180
BerkeleyEnvironment *env;

0 commit comments

Comments
 (0)