aquatic_common: extract response peers: don't return sender

Seems to fix or at least help with some issues with
real clients being slow to initiate transfers
This commit is contained in:
Joakim Frostegård 2020-08-16 23:07:39 +02:00
parent b5452c2954
commit 6ee8ed4895
6 changed files with 89 additions and 70 deletions

View file

@ -26,13 +26,14 @@ impl ValidUntil {
/// If there are more peers in map than `max_num_peers_to_take`, do a
/// half-random selection of peers from first and second halves of map,
/// in order to avoid returning too homogeneous peers.
///
/// Don't care if we send back announcing peer.
///
/// Might return one less peer than wanted since sender is filtered out.
#[inline]
pub fn extract_response_peers<K, V, R, F>(
rng: &mut impl Rng,
peer_map: &IndexMap<K, V>,
max_num_peers_to_take: usize,
sender_peer_map_key: K,
peer_conversion_function: F
) -> Vec<R>
where
@ -41,9 +42,15 @@ pub fn extract_response_peers<K, V, R, F>(
{
let peer_map_len = peer_map.len();
if peer_map_len <= max_num_peers_to_take {
peer_map.values()
.map(peer_conversion_function)
if peer_map_len <= max_num_peers_to_take + 1 {
peer_map.iter()
.filter_map(|(k, v)|{
if *k == sender_peer_map_key {
None
} else {
Some(peer_conversion_function(v))
}
})
.collect()
} else {
let half_num_to_take = max_num_peers_to_take / 2;
@ -64,17 +71,19 @@ pub fn extract_response_peers<K, V, R, F>(
let mut peers: Vec<R> = Vec::with_capacity(max_num_peers_to_take);
for i in offset_first_half..end_first_half {
if let Some((_, peer)) = peer_map.get_index(i){
peers.push(peer_conversion_function(peer))
if let Some((k, peer)) = peer_map.get_index(i){
if *k != sender_peer_map_key {
peers.push(peer_conversion_function(peer))
}
}
}
for i in offset_second_half..end_second_half {
if let Some((_, peer)) = peer_map.get_index(i){
peers.push(peer_conversion_function(peer))
if let Some((k, peer)) = peer_map.get_index(i){
if *k != sender_peer_map_key {
peers.push(peer_conversion_function(peer))
}
}
}
debug_assert_eq!(peers.len(), max_num_peers_to_take);
peers
}