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.
This commit is contained in:
moneromooo-monero 2018-02-21 19:31:27 +00:00
parent 4f80c50730
commit 6f8779d282
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -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"); LOG_PRINT_L3("block with id = " << id << " already exists");
bvc.m_already_exists = true; bvc.m_already_exists = true;
m_db->block_txn_stop(); m_db->block_txn_stop();
m_blocks_txs_check.clear();
return false; return false;
} }
@ -3556,7 +3557,9 @@ bool Blockchain::add_new_block(const block& bl_, block_verification_context& bvc
//chain switching or wrong block //chain switching or wrong block
bvc.m_added_to_main_chain = false; bvc.m_added_to_main_chain = false;
m_db->block_txn_stop(); 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 //never relay alternative blocks
} }