Remove a have_block() check so alternate block can be processed

Remove have_block() check from Blockchain::handle_block_to_main_chain().
Add logging to have_block().

This allows blockchain reorganization to proceed further.

have_block() check here causes an error after a blockchain reorganize
begins with error: "Attempting to add block to main chain, but it's
already either there or in an alternate chain."

While reorganizing to become the main chain, a block in the
alternative chain would be refused due to have_block() rightfully
finding it in the alternative chain. The reorganization would end in
rollback, restoring to previous blockchain.

Original implementation didn't call it here, and it doesn't appear
necessary to be called from here in this implementation either. When
needed, it appears it's called prior to handle_block_to_main_chain().
This commit is contained in:
warptangent 2015-01-11 18:19:01 -08:00
parent 4d0a94b20c
commit 909ea81067
No known key found for this signature in database
GPG Key ID: 0E490BEBFBE4E92D
1 changed files with 27 additions and 7 deletions

View File

@ -1699,13 +1699,22 @@ bool Blockchain::have_block(const crypto::hash& id) const
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(m_db->block_exists(id))
{
LOG_PRINT_L3("block exists in main chain");
return true;
}
if(m_alternative_chains.count(id))
{
LOG_PRINT_L3("block found in m_alternative_chains");
return true;
}
if(m_invalid_blocks.count(id))
{
LOG_PRINT_L3("block found in m_invalid_blocks");
return true;
}
return false;
}
@ -2010,14 +2019,25 @@ bool Blockchain::check_block_timestamp(const block& b) const
bool Blockchain::handle_block_to_main_chain(const block& bl, const crypto::hash& id, block_verification_context& bvc)
{
LOG_PRINT_L3("Blockchain::" << __func__);
// NOTE: Omitting check below with have_block() It causes an error after a
// blockchain reorganize begins with error: "Attempting to add block to main
// chain, but it's already either there or in an alternate"
//
// A block in the alternative chain, desired to become the main chain, never
// makes it due to have_block finding it in he alternative chain.
//
// Original implementation didn't use it here, and it doesn't appear
// necessary to be called from here in this implementation either.
// if we already have the block, return false
if (have_block(id))
{
LOG_PRINT_L0("Attempting to add block to main chain, but it's already either there or in an alternate chain. hash: " << id);
bvc.m_verifivation_failed = true;
return false;
}
// if (have_block(id))
// {
// LOG_PRINT_L0("Attempting to add block to main chain, but it's already either there or in an alternate chain. hash: " << id);
// bvc.m_verifivation_failed = true;
// return false;
// }
TIME_MEASURE_START(block_processing_time);
CRITICAL_REGION_LOCAL(m_blockchain_lock);
if(bl.prev_id != get_tail_id())