cryptonote_protocol: retry stale spans early
Connections can be dropped by the net_node layer, unbeknownst to cryptonote_protocol, which would then not flush any spans scheduled to that connection, which would cause it to be only downloaded again once it becomes the next span (possibly after a small delay if it had been requested less than 5 seconds ago).
This commit is contained in:
parent
90df52e12f
commit
f57ee382b8
|
@ -76,6 +76,22 @@ void block_queue::flush_spans(const boost::uuids::uuid &connection_id, bool all)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void block_queue::flush_stale_spans(const std::set<boost::uuids::uuid> &live_connections)
|
||||||
|
{
|
||||||
|
boost::unique_lock<boost::recursive_mutex> lock(mutex);
|
||||||
|
block_map::iterator i = blocks.begin();
|
||||||
|
if (i != blocks.end() && is_blockchain_placeholder(*i))
|
||||||
|
++i;
|
||||||
|
while (i != blocks.end())
|
||||||
|
{
|
||||||
|
block_map::iterator j = i++;
|
||||||
|
if (live_connections.find(j->connection_id) == live_connections.end() && j->blocks.size() == 0)
|
||||||
|
{
|
||||||
|
blocks.erase(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void block_queue::remove_span(uint64_t start_block_height)
|
void block_queue::remove_span(uint64_t start_block_height)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> lock(mutex);
|
boost::unique_lock<boost::recursive_mutex> lock(mutex);
|
||||||
|
|
|
@ -70,6 +70,7 @@ namespace cryptonote
|
||||||
void add_blocks(uint64_t height, std::list<cryptonote::block_complete_entry> bcel, const boost::uuids::uuid &connection_id, float rate, size_t size);
|
void add_blocks(uint64_t height, std::list<cryptonote::block_complete_entry> bcel, const boost::uuids::uuid &connection_id, float rate, size_t size);
|
||||||
void add_blocks(uint64_t height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time = boost::date_time::min_date_time);
|
void add_blocks(uint64_t height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time = boost::date_time::min_date_time);
|
||||||
void flush_spans(const boost::uuids::uuid &connection_id, bool all = false);
|
void flush_spans(const boost::uuids::uuid &connection_id, bool all = false);
|
||||||
|
void flush_stale_spans(const std::set<boost::uuids::uuid> &live_connections);
|
||||||
void remove_span(uint64_t start_block_height);
|
void remove_span(uint64_t start_block_height);
|
||||||
void remove_spans(const boost::uuids::uuid &connection_id, uint64_t start_block_height);
|
void remove_spans(const boost::uuids::uuid &connection_id, uint64_t start_block_height);
|
||||||
void mark_last_block(uint64_t last_block_height);
|
void mark_last_block(uint64_t last_block_height);
|
||||||
|
|
|
@ -1189,6 +1189,14 @@ skip:
|
||||||
{
|
{
|
||||||
m_block_queue.mark_last_block(m_core.get_current_blockchain_height() - 1);
|
m_block_queue.mark_last_block(m_core.get_current_blockchain_height() - 1);
|
||||||
|
|
||||||
|
// flush stale spans
|
||||||
|
std::set<boost::uuids::uuid> live_connections;
|
||||||
|
m_p2p->for_each_connection([&](cryptonote_connection_context& context, nodetool::peerid_type peer_id, uint32_t support_flags)->bool{
|
||||||
|
live_connections.insert(context.m_connection_id);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
m_block_queue.flush_stale_spans(live_connections);
|
||||||
|
|
||||||
// if we don't need to get next span, and the block queue is full enough, wait a bit
|
// if we don't need to get next span, and the block queue is full enough, wait a bit
|
||||||
bool start_from_current_chain = false;
|
bool start_from_current_chain = false;
|
||||||
if (!force_next_span)
|
if (!force_next_span)
|
||||||
|
|
Loading…
Reference in New Issue