Skip to content

Commit

Permalink
Merge #20130: Wallet: remove db mode string
Browse files Browse the repository at this point in the history
135afa7 wallet: remove db mode string (Ivan Metlushko)

Pull request description:

  This is a [follow-up](bitcoin/bitcoin#19077 (comment)) for #19077

  This PR simplifies DB interface by removing mode string from `WalletDatabase` and `WalletBatch`.

  The mode string was used to determine two flags for the instantiation of db connection:
  1) read-only flag. Never used on connection level. And on batch level Is only used within `BerkeleyDatabase::Rewrite` where it's replaced with bool flag.
  2) create flag. Is not required as we always check `require_existing` & `require_create` flags in `MakeDatabase()` before creating actual database instance. So we can safely default to always creating database if it doesn't exist yet.

ACKs for top commit:
  achow101:
    ACK 135afa7
  laanwj:
    Code review ACK 135afa7

Tree-SHA512: f49c07c7387c02e517a58199620a678a918f8dfc20d1347d29fd6adea0bc89698c26cb8eef42b0977961c11c207c4bbe109bc31059f47c126cc600b01fd987eb
  • Loading branch information
laanwj committed Oct 14, 2020
2 parents 3750f66 + 135afa7 commit 9efa55c
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 30 deletions.
22 changes: 9 additions & 13 deletions src/wallet/bdb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,30 +305,26 @@ BerkeleyDatabase::~BerkeleyDatabase()
}
}

BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode, bool fFlushOnCloseIn) : pdb(nullptr), activeTxn(nullptr), m_cursor(nullptr), m_database(database)
BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const bool read_only, bool fFlushOnCloseIn) : pdb(nullptr), activeTxn(nullptr), m_cursor(nullptr), m_database(database)
{
database.AddRef();
database.Open(pszMode);
fReadOnly = (!strchr(pszMode, '+') && !strchr(pszMode, 'w'));
database.Open();
fReadOnly = read_only;
fFlushOnClose = fFlushOnCloseIn;
env = database.env.get();
pdb = database.m_db.get();
strFile = database.strFile;
bool fCreate = strchr(pszMode, 'c') != nullptr;
if (fCreate && !Exists(std::string("version"))) {
if (!Exists(std::string("version"))) {
bool fTmp = fReadOnly;
fReadOnly = false;
Write(std::string("version"), CLIENT_VERSION);
fReadOnly = fTmp;
}
}

void BerkeleyDatabase::Open(const char* pszMode)
void BerkeleyDatabase::Open()
{
bool fCreate = strchr(pszMode, 'c') != nullptr;
unsigned int nFlags = DB_THREAD;
if (fCreate)
nFlags |= DB_CREATE;
unsigned int nFlags = DB_THREAD | DB_CREATE;

{
LOCK(cs_db);
Expand Down Expand Up @@ -468,7 +464,7 @@ bool BerkeleyDatabase::Rewrite(const char* pszSkip)
LogPrintf("BerkeleyBatch::Rewrite: Rewriting %s...\n", strFile);
std::string strFileRes = strFile + ".rewrite";
{ // surround usage of db with extra {}
BerkeleyBatch db(*this, "r");
BerkeleyBatch db(*this, true);
std::unique_ptr<Db> pdbCopy = MakeUnique<Db>(env->dbenv.get(), 0);

int ret = pdbCopy->open(nullptr, // Txn pointer
Expand Down Expand Up @@ -807,9 +803,9 @@ void BerkeleyDatabase::RemoveRef()
if (env) env->m_db_in_use.notify_all();
}

std::unique_ptr<DatabaseBatch> BerkeleyDatabase::MakeBatch(const char* mode, bool flush_on_close)
std::unique_ptr<DatabaseBatch> BerkeleyDatabase::MakeBatch(bool flush_on_close)
{
return MakeUnique<BerkeleyBatch>(*this, mode, flush_on_close);
return MakeUnique<BerkeleyBatch>(*this, false, flush_on_close);
}

bool ExistsBerkeleyDatabase(const fs::path& path)
Expand Down
9 changes: 4 additions & 5 deletions src/wallet/bdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,8 @@ class BerkeleyDatabase : public WalletDatabase

~BerkeleyDatabase() override;

/** Open the database if it is not already opened.
* Dummy function, doesn't do anything right now, but is needed for class abstraction */
void Open(const char* mode) override;
/** Open the database if it is not already opened. */
void Open() override;

/** Rewrite the entire database on disk, with the exception of key pszSkip if non-zero
*/
Expand Down Expand Up @@ -164,7 +163,7 @@ class BerkeleyDatabase : public WalletDatabase
std::string strFile;

/** Make a BerkeleyBatch connected to this database */
std::unique_ptr<DatabaseBatch> MakeBatch(const char* mode = "r+", bool flush_on_close = true) override;
std::unique_ptr<DatabaseBatch> MakeBatch(bool flush_on_close = true) override;
};

/** RAII class that provides access to a Berkeley database */
Expand Down Expand Up @@ -207,7 +206,7 @@ class BerkeleyBatch : public DatabaseBatch
BerkeleyDatabase& m_database;

public:
explicit BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode = "r+", bool fFlushOnCloseIn=true);
explicit BerkeleyBatch(BerkeleyDatabase& database, const bool fReadOnly, bool fFlushOnCloseIn=true);
~BerkeleyBatch() override;

BerkeleyBatch(const BerkeleyBatch&) = delete;
Expand Down
8 changes: 4 additions & 4 deletions src/wallet/db.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ class WalletDatabase
virtual ~WalletDatabase() {};

/** Open the database if it is not already opened. */
virtual void Open(const char* mode) = 0;
virtual void Open() = 0;

//! Counts the number of active database users to be sure that the database is not closed while someone is using it
std::atomic<int> m_refcount{0};
Expand Down Expand Up @@ -149,7 +149,7 @@ class WalletDatabase
int64_t nLastWalletUpdate;

/** Make a DatabaseBatch connected to this database */
virtual std::unique_ptr<DatabaseBatch> MakeBatch(const char* mode = "r+", bool flush_on_close = true) = 0;
virtual std::unique_ptr<DatabaseBatch> MakeBatch(bool flush_on_close = true) = 0;
};

/** RAII class that provides access to a DummyDatabase. Never fails. */
Expand Down Expand Up @@ -178,7 +178,7 @@ class DummyBatch : public DatabaseBatch
class DummyDatabase : public WalletDatabase
{
public:
void Open(const char* mode) override {};
void Open() override {};
void AddRef() override {}
void RemoveRef() override {}
bool Rewrite(const char* pszSkip=nullptr) override { return true; }
Expand All @@ -189,7 +189,7 @@ class DummyDatabase : public WalletDatabase
void IncrementUpdateCounter() override { ++nUpdateCounter; }
void ReloadDbEnv() override {}
std::string Filename() override { return "dummy"; }
std::unique_ptr<DatabaseBatch> MakeBatch(const char* mode = "r+", bool flush_on_close = true) override { return MakeUnique<DummyBatch>(); }
std::unique_ptr<DatabaseBatch> MakeBatch(bool flush_on_close = true) override { return MakeUnique<DummyBatch>(); }
};

enum class DatabaseFormat {
Expand Down
12 changes: 6 additions & 6 deletions src/wallet/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,7 @@ bool CWallet::MarkReplaced(const uint256& originalHash, const uint256& newHash)

wtx.mapValue["replaced_by_txid"] = newHash.ToString();

WalletBatch batch(*database, "r+");
WalletBatch batch(*database);

bool success = true;
if (!batch.WriteTx(wtx)) {
Expand Down Expand Up @@ -863,7 +863,7 @@ CWalletTx* CWallet::AddToWallet(CTransactionRef tx, const CWalletTx::Confirmatio
{
LOCK(cs_wallet);

WalletBatch batch(*database, "r+", fFlushOnClose);
WalletBatch batch(*database, fFlushOnClose);

uint256 hash = tx->GetHash();

Expand Down Expand Up @@ -1062,7 +1062,7 @@ bool CWallet::AbandonTransaction(const uint256& hashTx)
{
LOCK(cs_wallet);

WalletBatch batch(*database, "r+");
WalletBatch batch(*database);

std::set<uint256> todo;
std::set<uint256> done;
Expand Down Expand Up @@ -1125,7 +1125,7 @@ void CWallet::MarkConflicted(const uint256& hashBlock, int conflicting_height, c
return;

// Do not flush the wallet here for performance reasons
WalletBatch batch(*database, "r+", false);
WalletBatch batch(*database, false);

std::set<uint256> todo;
std::set<uint256> done;
Expand Down Expand Up @@ -3190,7 +3190,7 @@ DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
LOCK(cs_wallet);

fFirstRunRet = false;
DBErrors nLoadWalletRet = WalletBatch(*database,"cr+").LoadWallet(this);
DBErrors nLoadWalletRet = WalletBatch(*database).LoadWallet(this);
if (nLoadWalletRet == DBErrors::NEED_REWRITE)
{
if (database->Rewrite("\x04pool"))
Expand All @@ -3217,7 +3217,7 @@ DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
DBErrors CWallet::ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut)
{
AssertLockHeld(cs_wallet);
DBErrors nZapSelectTxRet = WalletBatch(*database, "cr+").ZapSelectTx(vHashIn, vHashOut);
DBErrors nZapSelectTxRet = WalletBatch(*database).ZapSelectTx(vHashIn, vHashOut);
for (const uint256& hash : vHashOut) {
const auto& it = mapWallet.find(hash);
wtxOrdered.erase(it->second.m_it_wtxOrdered);
Expand Down
4 changes: 2 additions & 2 deletions src/wallet/walletdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,8 +204,8 @@ class WalletBatch
}

public:
explicit WalletBatch(WalletDatabase& database, const char* pszMode = "r+", bool _fFlushOnClose = true) :
m_batch(database.MakeBatch(pszMode, _fFlushOnClose)),
explicit WalletBatch(WalletDatabase &database, bool _fFlushOnClose = true) :
m_batch(database.MakeBatch(_fFlushOnClose)),
m_database(database)
{
}
Expand Down

0 comments on commit 9efa55c

Please sign in to comment.