p2p: fix fallback seed node usage

Those were added to the seed nodes list even when they had already
been added. Moreover, the current index was not reset after they
were added, typically causing previous seeds to be used, and some
of those fallback seeds to not be tried.
This commit is contained in:
moneromooo-monero 2018-04-29 14:57:08 +01:00
parent cd22cb807a
commit 1590183965
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
2 changed files with 11 additions and 3 deletions

View file

@ -316,6 +316,7 @@ namespace nodetool
std::list<epee::net_utils::network_address> m_priority_peers; std::list<epee::net_utils::network_address> m_priority_peers;
std::vector<epee::net_utils::network_address> m_exclusive_peers; std::vector<epee::net_utils::network_address> m_exclusive_peers;
std::vector<epee::net_utils::network_address> m_seed_nodes; std::vector<epee::net_utils::network_address> m_seed_nodes;
bool m_fallback_seed_nodes_added;
std::list<nodetool::peerlist_entry> m_command_line_peers; std::list<nodetool::peerlist_entry> m_command_line_peers;
uint64_t m_peer_livetime; uint64_t m_peer_livetime;
//keep connections to initiate some interactions //keep connections to initiate some interactions

View file

@ -405,6 +405,7 @@ namespace nodetool
bool res = handle_command_line(vm); bool res = handle_command_line(vm);
CHECK_AND_ASSERT_MES(res, false, "Failed to handle command line"); CHECK_AND_ASSERT_MES(res, false, "Failed to handle command line");
m_fallback_seed_nodes_added = false;
if (m_nettype == cryptonote::TESTNET) if (m_nettype == cryptonote::TESTNET)
{ {
memcpy(&m_network_id, &::config::testnet::NETWORK_ID, 16); memcpy(&m_network_id, &::config::testnet::NETWORK_ID, 16);
@ -498,6 +499,7 @@ namespace nodetool
for (const auto &peer: get_seed_nodes(cryptonote::MAINNET)) for (const auto &peer: get_seed_nodes(cryptonote::MAINNET))
full_addrs.insert(peer); full_addrs.insert(peer);
m_fallback_seed_nodes_added = true;
} }
} }
} }
@ -1134,7 +1136,6 @@ namespace nodetool
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;
while(true) while(true)
{ {
if(m_net_server.is_stop_signal_sent()) if(m_net_server.is_stop_signal_sent())
@ -1144,15 +1145,21 @@ namespace nodetool
break; break;
if(++try_count > m_seed_nodes.size()) if(++try_count > m_seed_nodes.size())
{ {
if (!fallback_nodes_added) if (!m_fallback_seed_nodes_added)
{ {
MWARNING("Failed to connect to any of seed peers, trying fallback seeds"); MWARNING("Failed to connect to any of seed peers, trying fallback seeds");
current_index = m_seed_nodes.size();
for (const auto &peer: get_seed_nodes(m_nettype)) for (const auto &peer: get_seed_nodes(m_nettype))
{ {
MDEBUG("Fallback seed node: " << peer); MDEBUG("Fallback seed node: " << peer);
append_net_address(m_seed_nodes, peer); append_net_address(m_seed_nodes, peer);
} }
fallback_nodes_added = true; m_fallback_seed_nodes_added = true;
if (current_index == m_seed_nodes.size())
{
MWARNING("No fallback seeds, continuing without seeds");
break;
}
// continue for another few cycles // continue for another few cycles
} }
else else