From 84a8b2da140c20be3b0c4042160524d226634d0f Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 31 Jan 2018 18:18:01 +0000 Subject: [PATCH] Don't create readtxn until after txn_safe gate check --- src/blockchain_db/lmdb/db_lmdb.cpp | 11 +++++++++-- src/blockchain_db/lmdb/db_lmdb.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp index d19399bec..59daf1bf0 100644 --- a/src/blockchain_db/lmdb/db_lmdb.cpp +++ b/src/blockchain_db/lmdb/db_lmdb.cpp @@ -338,6 +338,12 @@ mdb_txn_safe::~mdb_txn_safe() num_active_txns--; } +void mdb_txn_safe::uncheck() +{ + num_active_txns--; + m_check = false; +} + void mdb_txn_safe::commit(std::string message) { if (message.size() == 0) @@ -1439,9 +1445,10 @@ void BlockchainLMDB::unlock() #define TXN_PREFIX_RDONLY() \ MDB_txn *m_txn; \ mdb_txn_cursors *m_cursors; \ + mdb_txn_safe auto_txn; \ bool my_rtxn = block_rtxn_start(&m_txn, &m_cursors); \ - mdb_txn_safe auto_txn(my_rtxn); \ - if (my_rtxn) auto_txn.m_tinfo = m_tinfo.get() + if (my_rtxn) auto_txn.m_tinfo = m_tinfo.get(); \ + else auto_txn.uncheck() #define TXN_POSTFIX_RDONLY() #define TXN_POSTFIX_SUCCESS() \ diff --git a/src/blockchain_db/lmdb/db_lmdb.h b/src/blockchain_db/lmdb/db_lmdb.h index ecd14f11b..e4c1fef84 100644 --- a/src/blockchain_db/lmdb/db_lmdb.h +++ b/src/blockchain_db/lmdb/db_lmdb.h @@ -112,6 +112,7 @@ struct mdb_txn_safe // 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(); + void uncheck(); operator MDB_txn*() {