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;
|
||||
++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);
|
||||
add_blocks(span_start_height, span_length, connection_id, time);
|
||||
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");
|
||||
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
|
||||
|
||||
// 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)
|
||||
<< ", 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();
|
||||
|
||||
m_core.prepare_handle_incoming_blocks(blocks);
|
||||
|
@ -1484,7 +1523,6 @@ skip:
|
|||
{
|
||||
context.m_needed_objects.push_back(bl_id);
|
||||
}
|
||||
context.m_last_known_hash = context.m_needed_objects.back();
|
||||
|
||||
if (!request_missing_objects(context, false))
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue