aboutsummaryrefslogtreecommitdiff
path: root/src/cryptonote_core/blockchain.cpp
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2018-02-21 19:31:27 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2018-02-23 19:47:17 +0000
commit6f8779d2825c90fa3191969f4780fb021ecc75de (patch)
treea1de27393d438f546e05acff345ce14214434582 /src/cryptonote_core/blockchain.cpp
parentMerge pull request #3275 (diff)
downloadmonero-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.cpp5
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
}