Add randomization in sync retry batch peer selection (#5822)

* Add randomization in sync retry batch peer selection

* Use min

* Apply suggestions from code review

Co-authored-by: João Oliveira <hello@jxs.pt>

* Merge branch 'unstable' into peer-prio
This commit is contained in:
Lion - dapplion
2024-07-09 02:24:52 +02:00
committed by GitHub
parent 9942c18c11
commit 2e2ccec9b5
2 changed files with 29 additions and 27 deletions

View File

@@ -919,24 +919,22 @@ impl<T: BeaconChainTypes> BackFillSync<T> {
// Find a peer to request the batch
let failed_peers = batch.failed_peers();
let new_peer = {
let mut priorized_peers = self
.network_globals
.peers
.read()
.synced_peers()
.map(|peer| {
(
failed_peers.contains(peer),
self.active_requests.get(peer).map(|v| v.len()).unwrap_or(0),
*peer,
)
})
.collect::<Vec<_>>();
let new_peer = self
.network_globals
.peers
.read()
.synced_peers()
.map(|peer| {
(
failed_peers.contains(peer),
self.active_requests.get(peer).map(|v| v.len()).unwrap_or(0),
rand::random::<u32>(),
*peer,
)
})
// Sort peers prioritizing unrelated peers with less active requests.
priorized_peers.sort_unstable();
priorized_peers.first().map(|&(_, _, peer)| peer)
};
.min()
.map(|(_, _, _, peer)| peer);
if let Some(peer) = new_peer {
self.participating_peers.insert(peer);

View File

@@ -7,7 +7,7 @@ use beacon_chain::BeaconChainTypes;
use fnv::FnvHashMap;
use lighthouse_network::service::api_types::Id;
use lighthouse_network::{PeerAction, PeerId};
use rand::seq::SliceRandom;
use rand::{seq::SliceRandom, Rng};
use slog::{crit, debug, o, warn};
use std::collections::{btree_map::Entry, BTreeMap, HashSet};
use std::hash::{Hash, Hasher};
@@ -873,16 +873,20 @@ impl<T: BeaconChainTypes> SyncingChain<T> {
// Find a peer to request the batch
let failed_peers = batch.failed_peers();
let new_peer = {
let mut priorized_peers = self
.peers
.iter()
.map(|(peer, requests)| (failed_peers.contains(peer), requests.len(), *peer))
.collect::<Vec<_>>();
let new_peer = self
.peers
.iter()
.map(|(peer, requests)| {
(
failed_peers.contains(peer),
requests.len(),
rand::thread_rng().gen::<u32>(),
*peer,
)
})
// Sort peers prioritizing unrelated peers with less active requests.
priorized_peers.sort_unstable();
priorized_peers.first().map(|&(_, _, peer)| peer)
};
.min()
.map(|(_, _, _, peer)| peer);
if let Some(peer) = new_peer {
self.send_batch(network, batch_id, peer)