Merge pull request #2295
35e01a6e
cryptonote_protocol: fix "holes" in block download schedule (moneromooo-monero)3da1edfd
cryptonote_protocol: fix out of order addition (moneromooo-monero)6edb1b3e
block_queue: do not add empty spans (moneromooo-monero)
This commit is contained in:
commit
c1f651175a
|
@ -189,6 +189,8 @@ std::pair<uint64_t, uint64_t> block_queue::reserve_span(uint64_t first_block_hei
|
||||||
++i;
|
++i;
|
||||||
++span_length;
|
++span_length;
|
||||||
}
|
}
|
||||||
|
if (span_length == 0)
|
||||||
|
return std::make_pair(0, 0);
|
||||||
MDEBUG("Reserving span " << span_start_height << " - " << (span_start_height + span_length - 1) << " for " << connection_id);
|
MDEBUG("Reserving span " << span_start_height << " - " << (span_start_height + span_length - 1) << " for " << connection_id);
|
||||||
add_blocks(span_start_height, span_length, connection_id, time);
|
add_blocks(span_start_height, span_length, connection_id, time);
|
||||||
set_span_hashes(span_start_height, connection_id, hashes);
|
set_span_hashes(span_start_height, connection_id, hashes);
|
||||||
|
|
|
@ -959,6 +959,8 @@ 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);
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
// We try to lock the sync lock. If we can, it means no other thread is
|
// We try to lock the sync lock. If we can, it means no other thread is
|
||||||
|
@ -990,6 +992,43 @@ namespace cryptonote
|
||||||
MDEBUG(context << " next span in the queue has blocks " << start_height << "-" << (start_height + blocks.size() - 1)
|
MDEBUG(context << " next span in the queue has blocks " << start_height << "-" << (start_height + blocks.size() - 1)
|
||||||
<< ", we need " << previous_height);
|
<< ", we need " << previous_height);
|
||||||
|
|
||||||
|
|
||||||
|
block new_block;
|
||||||
|
if (!parse_and_validate_block_from_blob(blocks.front().block, new_block))
|
||||||
|
{
|
||||||
|
MERROR("Failed to parse block, but it should already have been parsed");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
bool parent_known = m_core.have_block(new_block.prev_id);
|
||||||
|
if (!parent_known)
|
||||||
|
{
|
||||||
|
// it could be:
|
||||||
|
// - later in the current chain
|
||||||
|
// - later in an alt chain
|
||||||
|
// - orphan
|
||||||
|
// if it was requested, then it'll be resolved later, otherwise it's an orphan
|
||||||
|
bool parent_requested = false;
|
||||||
|
m_p2p->for_each_connection([&](cryptonote_connection_context& context, nodetool::peerid_type peer_id, uint32_t support_flags)->bool{
|
||||||
|
if (context.m_requested_objects.find(new_block.prev_id) != context.m_requested_objects.end())
|
||||||
|
{
|
||||||
|
parent_requested = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
if (!parent_requested)
|
||||||
|
{
|
||||||
|
LOG_ERROR_CCONTEXT("Got block with unknown parent which was not requested - dropping connection");
|
||||||
|
// in case the peer had dropped beforehand, remove the span anyway so other threads can wake up and get it
|
||||||
|
m_block_queue.remove_spans(span_connection_id, start_height);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// parent was requested, so we wait for it to be retrieved
|
||||||
|
MINFO(context << " parent was requested, we'll get back to it");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
const boost::posix_time::ptime start = boost::posix_time::microsec_clock::universal_time();
|
const boost::posix_time::ptime start = boost::posix_time::microsec_clock::universal_time();
|
||||||
|
|
||||||
m_core.prepare_handle_incoming_blocks(blocks);
|
m_core.prepare_handle_incoming_blocks(blocks);
|
||||||
|
@ -1484,7 +1523,6 @@ skip:
|
||||||
{
|
{
|
||||||
context.m_needed_objects.push_back(bl_id);
|
context.m_needed_objects.push_back(bl_id);
|
||||||
}
|
}
|
||||||
context.m_last_known_hash = context.m_needed_objects.back();
|
|
||||||
|
|
||||||
if (!request_missing_objects(context, false))
|
if (!request_missing_objects(context, false))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue