aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp54
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.h55
2 files changed, 58 insertions, 51 deletions
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index 5126db400..211e2f3ed 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -148,6 +148,60 @@ inline void lmdb_db_open(MDB_txn* txn, const char* name, int flags, MDB_dbi& dbi
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
// as a batch import with verification enabled, or possibly (later) a batch
diff --git a/src/blockchain_db/lmdb/db_lmdb.h b/src/blockchain_db/lmdb/db_lmdb.h
index 8f1e07e0d..6c05de06e 100644
--- a/src/blockchain_db/lmdb/db_lmdb.h
+++ b/src/blockchain_db/lmdb/db_lmdb.h
@@ -36,63 +36,16 @@ namespace cryptonote
struct mdb_txn_safe
{
- mdb_txn_safe() : m_txn(NULL) { }
- ~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);
- }
- }
+ mdb_txn_safe();
+ ~mdb_txn_safe();
- 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;
- }
+ void commit(std::string message = "");
// 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
// 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.
- 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");
- }
- }
+ void abort();
operator MDB_txn*()
{