mirror of
https://github.com/monero-project/monero.git
synced 2024-12-23 20:19:34 +00:00
p2p: give all hosts the same chance of being picked for connecting
even if some run more than one node
This commit is contained in:
parent
850edfe419
commit
6c9980a55b
1 changed files with 26 additions and 1 deletions
|
@ -1502,13 +1502,28 @@ namespace nodetool
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto get_host_string = [](const epee::net_utils::network_address &address) {
|
||||||
|
#if BOOST_VERSION > 106600
|
||||||
|
if (address.get_type_id() == epee::net_utils::ipv6_network_address::get_type_id())
|
||||||
|
{
|
||||||
|
boost::asio::ip::address_v6 actual_ip = address.as<const epee::net_utils::ipv6_network_address>().ip();
|
||||||
|
if (actual_ip.is_v4_mapped())
|
||||||
|
{
|
||||||
|
boost::asio::ip::address_v4 v4ip = make_address_v4(boost::asio::ip::v4_mapped, actual_ip);
|
||||||
|
return epee::net_utils::ipv4_network_address(v4ip.to_uint(), 0).host_str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return address.host_str();
|
||||||
|
};
|
||||||
|
std::unordered_set<std::string> hosts_added;
|
||||||
std::deque<size_t> filtered;
|
std::deque<size_t> filtered;
|
||||||
const size_t limit = use_white_list ? 20 : std::numeric_limits<size_t>::max();
|
const size_t limit = use_white_list ? 20 : std::numeric_limits<size_t>::max();
|
||||||
for (int step = 0; step < 2; ++step)
|
for (int step = 0; step < 2; ++step)
|
||||||
{
|
{
|
||||||
bool skip_duplicate_class_B = step == 0;
|
bool skip_duplicate_class_B = step == 0;
|
||||||
size_t idx = 0, skipped = 0;
|
size_t idx = 0, skipped = 0;
|
||||||
zone.m_peerlist.foreach (use_white_list, [&classB, &filtered, &idx, &skipped, skip_duplicate_class_B, limit, next_needed_pruning_stripe](const peerlist_entry &pe){
|
zone.m_peerlist.foreach (use_white_list, [&classB, &filtered, &idx, &skipped, skip_duplicate_class_B, limit, next_needed_pruning_stripe, &hosts_added, &get_host_string](const peerlist_entry &pe){
|
||||||
if (filtered.size() >= limit)
|
if (filtered.size() >= limit)
|
||||||
return false;
|
return false;
|
||||||
bool skip = false;
|
bool skip = false;
|
||||||
|
@ -1532,6 +1547,15 @@ namespace nodetool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// consider each host once, to avoid giving undue inflence to hosts running several nodes
|
||||||
|
if (!skip)
|
||||||
|
{
|
||||||
|
const auto i = hosts_added.find(get_host_string(pe.adr));
|
||||||
|
if (i != hosts_added.end())
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (skip)
|
if (skip)
|
||||||
++skipped;
|
++skipped;
|
||||||
else if (next_needed_pruning_stripe == 0 || pe.pruning_seed == 0)
|
else if (next_needed_pruning_stripe == 0 || pe.pruning_seed == 0)
|
||||||
|
@ -1539,6 +1563,7 @@ namespace nodetool
|
||||||
else if (next_needed_pruning_stripe == tools::get_pruning_stripe(pe.pruning_seed))
|
else if (next_needed_pruning_stripe == tools::get_pruning_stripe(pe.pruning_seed))
|
||||||
filtered.push_front(idx);
|
filtered.push_front(idx);
|
||||||
++idx;
|
++idx;
|
||||||
|
hosts_added.insert(get_host_string(pe.adr));
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
if (skipped == 0 || !filtered.empty())
|
if (skipped == 0 || !filtered.empty())
|
||||||
|
|
Loading…
Reference in a new issue