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:
parent
181a008aa3
commit
7591c528d0
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
//-----------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue