Merge pull request #1687

1a7e18bf Make gray peer selection uniform (Miguel Herranz)
f3be9991 Make get_random_gray_peer distribution uniform (Miguel Herranz)
This commit is contained in:
Riccardo Spagni 2017-03-03 14:29:23 +02:00
commit 11f8e0d33f
No known key found for this signature in database
GPG key ID: 55432DF31CCD4FCD
2 changed files with 10 additions and 6 deletions

View file

@ -1023,7 +1023,14 @@ namespace nodetool
while(rand_count < (max_random_index+1)*3 && try_count < 10 && !m_net_server.is_stop_signal_sent()) while(rand_count < (max_random_index+1)*3 && try_count < 10 && !m_net_server.is_stop_signal_sent())
{ {
++rand_count; ++rand_count;
size_t random_index = get_random_index_with_fixed_probability(max_random_index); size_t random_index;
if (use_white_list) {
random_index = get_random_index_with_fixed_probability(max_random_index);
} else {
random_index = crypto::rand<size_t>() % m_peerlist.get_gray_peers_count();
}
CHECK_AND_ASSERT_MES(random_index < local_peers_count, false, "random_starter_index < peers_local.size() failed!!"); CHECK_AND_ASSERT_MES(random_index < local_peers_count, false, "random_starter_index < peers_local.size() failed!!");
if(tried_peers.count(random_index)) if(tried_peers.count(random_index))

View file

@ -408,13 +408,10 @@ namespace nodetool
return false; return false;
} }
size_t x = crypto::rand<size_t>() % (m_peers_gray.size() + 1); size_t random_index = crypto::rand<size_t>() % m_peers_gray.size();
size_t res = (x * x * x) / (m_peers_gray.size() * m_peers_gray.size()); //parabola \/
LOG_PRINT_L3("Random gray peer index=" << res << "(x="<< x << ", max_index=" << m_peers_gray.size() << ")");
peers_indexed::index<by_time>::type& by_time_index = m_peers_gray.get<by_time>(); peers_indexed::index<by_time>::type& by_time_index = m_peers_gray.get<by_time>();
pe = *epee::misc_utils::move_it_backward(--by_time_index.end(), res); pe = *epee::misc_utils::move_it_backward(--by_time_index.end(), random_index);
return true; return true;