cryptonote_protocol: fix needless chain hashes downloads

The last known hash was calculated incorrectly, causing
further chain hash downloads to restart from the current
chain. When the block queue has close to 10k blocks waiting,
this causes frequent downloads of 10k more hashes, but
with only the last few hashes actually being useful.
This commit is contained in:
moneromooo-monero 2017-09-17 14:13:59 +01:00
parent 7abdba0a5c
commit 3487d81034
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -936,7 +936,8 @@ namespace cryptonote
} }
// get the last parsed block, which should be the highest one // get the last parsed block, which should be the highest one
if(m_core.have_block(cryptonote::get_block_hash(b))) const crypto::hash last_block_hash = cryptonote::get_block_hash(b);
if(m_core.have_block(last_block_hash))
{ {
const uint64_t subchain_height = start_height + arg.blocks.size(); const uint64_t subchain_height = start_height + arg.blocks.size();
LOG_DEBUG_CC(context, "These are old blocks, ignoring: blocks " << start_height << " - " << (subchain_height-1) << ", blockchain height " << m_core.get_current_blockchain_height()); LOG_DEBUG_CC(context, "These are old blocks, ignoring: blocks " << start_height << " - " << (subchain_height-1) << ", blockchain height " << m_core.get_current_blockchain_height());
@ -954,7 +955,7 @@ namespace cryptonote
MDEBUG(context << " adding span: " << arg.blocks.size() << " at height " << start_height << ", " << dt.total_microseconds()/1e6 << " seconds, " << (rate/1e3) << " kB/s, size now " << (m_block_queue.get_data_size() + blocks_size) / 1048576.f << " MB"); MDEBUG(context << " adding span: " << arg.blocks.size() << " at height " << start_height << ", " << dt.total_microseconds()/1e6 << " seconds, " << (rate/1e3) << " kB/s, size now " << (m_block_queue.get_data_size() + blocks_size) / 1048576.f << " MB");
m_block_queue.add_blocks(start_height, arg.blocks, context.m_connection_id, rate, blocks_size); m_block_queue.add_blocks(start_height, arg.blocks, context.m_connection_id, rate, blocks_size);
context.m_last_known_hash = cryptonote::get_blob_hash(arg.blocks.back().block); context.m_last_known_hash = last_block_hash;
if (!m_core.get_test_drop_download() || !m_core.get_test_drop_download_height()) { // DISCARD BLOCKS for testing if (!m_core.get_test_drop_download() || !m_core.get_test_drop_download_height()) { // DISCARD BLOCKS for testing
return 1; return 1;