mirror of
https://codeberg.org/anoncontributorxmr/monero.git
synced 2024-11-29 10:43:14 +00:00
Move mdb_txn_safe implementation to cpp file
This commit is contained in:
parent
21a72bd47b
commit
ac79502308
2 changed files with 58 additions and 51 deletions
|
@ -148,6 +148,60 @@ inline void lmdb_db_open(MDB_txn* txn, const char* name, int flags, MDB_dbi& dbi
|
||||||
|
|
||||||
namespace cryptonote
|
namespace cryptonote
|
||||||
{
|
{
|
||||||
|
mdb_txn_safe::mdb_txn_safe() : m_txn(NULL) { }
|
||||||
|
|
||||||
|
mdb_txn_safe::~mdb_txn_safe()
|
||||||
|
{
|
||||||
|
LOG_PRINT_L3("mdb_txn_safe: destructor");
|
||||||
|
if (m_txn != NULL)
|
||||||
|
{
|
||||||
|
if (m_batch_txn) // this is a batch txn and should have been handled before this point for safety
|
||||||
|
{
|
||||||
|
LOG_PRINT_L0("WARNING: mdb_txn_safe: m_txn is a batch txn and it's not NULL in destructor - calling mdb_txn_abort()");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Example of when this occurs: a lookup fails, so a read-only txn is
|
||||||
|
// aborted through this destructor. However, successful read-only txns
|
||||||
|
// ideally should have been committed when done and not end up here.
|
||||||
|
//
|
||||||
|
// NOTE: not sure if this is ever reached for a non-batch write
|
||||||
|
// transaction, but it's probably not ideal if it did.
|
||||||
|
LOG_PRINT_L3("mdb_txn_safe: m_txn not NULL in destructor - calling mdb_txn_abort()");
|
||||||
|
}
|
||||||
|
mdb_txn_abort(m_txn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mdb_txn_safe::commit(std::string message)
|
||||||
|
{
|
||||||
|
if (message.size() == 0)
|
||||||
|
{
|
||||||
|
message = "Failed to commit a transaction to the db";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mdb_txn_commit(m_txn))
|
||||||
|
{
|
||||||
|
m_txn = NULL;
|
||||||
|
LOG_PRINT_L0(message);
|
||||||
|
throw DB_ERROR(message.c_str());
|
||||||
|
}
|
||||||
|
m_txn = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mdb_txn_safe::abort()
|
||||||
|
{
|
||||||
|
LOG_PRINT_L3("mdb_txn_safe: abort()");
|
||||||
|
if(m_txn != NULL)
|
||||||
|
{
|
||||||
|
mdb_txn_abort(m_txn);
|
||||||
|
m_txn = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_PRINT_L0("WARNING: mdb_txn_safe: abort() called, but m_txn is NULL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If m_batch_active is set, a batch transaction exists beyond this class, such
|
// If m_batch_active is set, a batch transaction exists beyond this class, such
|
||||||
// as a batch import with verification enabled, or possibly (later) a batch
|
// as a batch import with verification enabled, or possibly (later) a batch
|
||||||
|
|
|
@ -36,63 +36,16 @@ namespace cryptonote
|
||||||
|
|
||||||
struct mdb_txn_safe
|
struct mdb_txn_safe
|
||||||
{
|
{
|
||||||
mdb_txn_safe() : m_txn(NULL) { }
|
mdb_txn_safe();
|
||||||
~mdb_txn_safe()
|
~mdb_txn_safe();
|
||||||
{
|
|
||||||
LOG_PRINT_L3("mdb_txn_safe: destructor");
|
|
||||||
if (m_txn != NULL)
|
|
||||||
{
|
|
||||||
if (m_batch_txn) // this is a batch txn and should have been handled before this point for safety
|
|
||||||
{
|
|
||||||
LOG_PRINT_L0("WARNING: mdb_txn_safe: m_txn is a batch txn and it's not NULL in destructor - calling mdb_txn_abort()");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Example of when this occurs: a lookup fails, so a read-only txn is
|
|
||||||
// aborted through this destructor. However, successful read-only txns
|
|
||||||
// ideally should have been committed when done and not end up here.
|
|
||||||
//
|
|
||||||
// NOTE: not sure if this is ever reached for a non-batch write
|
|
||||||
// transaction, but it's probably not ideal if it did.
|
|
||||||
LOG_PRINT_L3("mdb_txn_safe: m_txn not NULL in destructor - calling mdb_txn_abort()");
|
|
||||||
}
|
|
||||||
mdb_txn_abort(m_txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void commit(std::string message = "")
|
void commit(std::string message = "");
|
||||||
{
|
|
||||||
if (message.size() == 0)
|
|
||||||
{
|
|
||||||
message = "Failed to commit a transaction to the db";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mdb_txn_commit(m_txn))
|
|
||||||
{
|
|
||||||
m_txn = NULL;
|
|
||||||
LOG_PRINT_L0(message);
|
|
||||||
throw DB_ERROR(message.c_str());
|
|
||||||
}
|
|
||||||
m_txn = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This should only be needed for batch transaction which must be ensured to
|
// This should only be needed for batch transaction which must be ensured to
|
||||||
// be aborted before mdb_env_close, not after. So we can't rely on
|
// be aborted before mdb_env_close, not after. So we can't rely on
|
||||||
// BlockchainLMDB destructor to call mdb_txn_safe destructor, as that's too late
|
// BlockchainLMDB destructor to call mdb_txn_safe destructor, as that's too late
|
||||||
// to properly abort, since mdb_env_close would have been called earlier.
|
// to properly abort, since mdb_env_close would have been called earlier.
|
||||||
void abort()
|
void abort();
|
||||||
{
|
|
||||||
LOG_PRINT_L3("mdb_txn_safe: abort()");
|
|
||||||
if(m_txn != NULL)
|
|
||||||
{
|
|
||||||
mdb_txn_abort(m_txn);
|
|
||||||
m_txn = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_PRINT_L0("WARNING: mdb_txn_safe: abort() called, but m_txn is NULL");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
operator MDB_txn*()
|
operator MDB_txn*()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue