diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2018-02-21 19:31:27 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2018-02-23 19:47:17 +0000 |
commit | 6f8779d2825c90fa3191969f4780fb021ecc75de (patch) | |
tree | a1de27393d438f546e05acff345ce14214434582 /src/cryptonote_core/blockchain.cpp | |
parent | Merge pull request #3275 (diff) | |
download | monero-6f8779d2825c90fa3191969f4780fb021ecc75de.tar.xz |
blockchain: fix random sync failures
When a block is added as part of a chunk (when syncing historical
blocks), a block may end up already in the blockchain if it was
added to the queue before being added to the chain (though it's
not clear how that could happen, but it's an implementation detail)
and thus may not be added to the chain when add_block is called.
This would cause m_blocks_txs_check to not be cleared, causing it
to get out of sync at next call, and thus wrongfully reject the
next block.
Diffstat (limited to 'src/cryptonote_core/blockchain.cpp')
-rw-r--r-- | src/cryptonote_core/blockchain.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index fe4004caa..812f652ad 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -3547,6 +3547,7 @@ bool Blockchain::add_new_block(const block& bl_, block_verification_context& bvc LOG_PRINT_L3("block with id = " << id << " already exists"); bvc.m_already_exists = true; m_db->block_txn_stop(); + m_blocks_txs_check.clear(); return false; } @@ -3556,7 +3557,9 @@ bool Blockchain::add_new_block(const block& bl_, block_verification_context& bvc //chain switching or wrong block bvc.m_added_to_main_chain = false; m_db->block_txn_stop(); - return handle_alternative_block(bl, id, bvc); + bool r = handle_alternative_block(bl, id, bvc); + m_blocks_txs_check.clear(); + return r; //never relay alternative blocks } |