p2p: fallback on seed nodes if we can't make a connection

This avoids failing to connect to the network in case all
known peers are unavailable (which can happen if the peer
list is small).
This commit is contained in:
moneromooo-monero 2017-08-09 22:44:39 +01:00
parent 181a008aa3
commit 7591c528d0
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
2 changed files with 26 additions and 6 deletions

View file

@ -226,6 +226,7 @@ namespace nodetool
bool is_addr_recently_failed(const epee::net_utils::network_address& addr); bool is_addr_recently_failed(const epee::net_utils::network_address& addr);
bool is_priority_node(const epee::net_utils::network_address& na); bool is_priority_node(const epee::net_utils::network_address& na);
std::set<std::string> get_seed_nodes(bool testnet) const; std::set<std::string> get_seed_nodes(bool testnet) const;
bool connect_to_seed();
template <class Container> template <class Container>
bool connect_to_peerlist(const Container& peers); bool connect_to_peerlist(const Container& peers);

View file

@ -1171,14 +1171,11 @@ namespace nodetool
} }
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
template<class t_payload_net_handler> template<class t_payload_net_handler>
bool node_server<t_payload_net_handler>::connections_maker() bool node_server<t_payload_net_handler>::connect_to_seed()
{ {
if (!connect_to_peerlist(m_exclusive_peers)) return false; if (m_seed_nodes.empty())
return true;
if (!m_exclusive_peers.empty()) return true;
if(!m_peerlist.get_white_peers_count() && m_seed_nodes.size())
{
size_t try_count = 0; size_t try_count = 0;
size_t current_index = crypto::rand<size_t>()%m_seed_nodes.size(); size_t current_index = crypto::rand<size_t>()%m_seed_nodes.size();
bool fallback_nodes_added = false; bool fallback_nodes_added = false;
@ -1211,6 +1208,21 @@ namespace nodetool
if(++current_index >= m_seed_nodes.size()) if(++current_index >= m_seed_nodes.size())
current_index = 0; current_index = 0;
} }
return true;
}
//-----------------------------------------------------------------------------------
template<class t_payload_net_handler>
bool node_server<t_payload_net_handler>::connections_maker()
{
if (!connect_to_peerlist(m_exclusive_peers)) return false;
if (!m_exclusive_peers.empty()) return true;
size_t start_conn_count = get_outgoing_connections_count();
if(!m_peerlist.get_white_peers_count() && m_seed_nodes.size())
{
if (!connect_to_seed())
return false;
} }
if (!connect_to_peerlist(m_priority_peers)) return false; if (!connect_to_peerlist(m_priority_peers)) return false;
@ -1242,6 +1254,13 @@ namespace nodetool
} }
} }
if (start_conn_count == get_outgoing_connections_count() && start_conn_count < m_config.m_net_config.connections_count)
{
MINFO("Failed to connect to any, trying seeds");
if (!connect_to_seed())
return false;
}
return true; return true;
} }
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------