Merge pull request #4928

affff94 blockchain: fix race between two external mining threads (moneromooo-monero)
This commit is contained in:
luigi1111 2018-12-31 15:28:25 -06:00
commit 6d3caaff70
No known key found for this signature in database
GPG key ID: F4ACA0183641E010

View file

@ -1269,7 +1269,9 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
uint64_t already_generated_coins; uint64_t already_generated_coins;
uint64_t pool_cookie; uint64_t pool_cookie;
CRITICAL_REGION_BEGIN(m_blockchain_lock); m_tx_pool.lock();
const auto unlock_guard = epee::misc_utils::create_scope_leave_handler([&]() { m_tx_pool.unlock(); });
CRITICAL_REGION_LOCAL(m_blockchain_lock);
height = m_db->height(); height = m_db->height();
if (m_btc_valid) { if (m_btc_valid) {
// The pool cookie is atomic. The lack of locking is OK, as if it changes // The pool cookie is atomic. The lack of locking is OK, as if it changes
@ -1305,8 +1307,6 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
median_weight = m_current_block_cumul_weight_limit / 2; median_weight = m_current_block_cumul_weight_limit / 2;
already_generated_coins = m_db->get_block_already_generated_coins(height - 1); already_generated_coins = m_db->get_block_already_generated_coins(height - 1);
CRITICAL_REGION_END();
size_t txs_weight; size_t txs_weight;
uint64_t fee; uint64_t fee;
if (!m_tx_pool.fill_block_template(b, median_weight, already_generated_coins, txs_weight, fee, expected_reward, m_hardfork->get_current_version())) if (!m_tx_pool.fill_block_template(b, median_weight, already_generated_coins, txs_weight, fee, expected_reward, m_hardfork->get_current_version()))
@ -1317,7 +1317,6 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
#if defined(DEBUG_CREATE_BLOCK_TEMPLATE) #if defined(DEBUG_CREATE_BLOCK_TEMPLATE)
size_t real_txs_weight = 0; size_t real_txs_weight = 0;
uint64_t real_fee = 0; uint64_t real_fee = 0;
CRITICAL_REGION_BEGIN(m_tx_pool.m_transactions_lock);
for(crypto::hash &cur_hash: b.tx_hashes) for(crypto::hash &cur_hash: b.tx_hashes)
{ {
auto cur_res = m_tx_pool.m_transactions.find(cur_hash); auto cur_res = m_tx_pool.m_transactions.find(cur_hash);
@ -1361,7 +1360,6 @@ bool Blockchain::create_block_template(block& b, const account_public_address& m
{ {
LOG_ERROR("Creating block template: error: wrongly calculated fee"); LOG_ERROR("Creating block template: error: wrongly calculated fee");
} }
CRITICAL_REGION_END();
MDEBUG("Creating block template: height " << height << MDEBUG("Creating block template: height " << height <<
", median weight " << median_weight << ", median weight " << median_weight <<
", already generated coins " << already_generated_coins << ", already generated coins " << already_generated_coins <<