Flexible peer filtering (#3458)

* first pass at peers iter cleanup

* more flexible peer with diff lookups

* PeersIter with impl Iterator

* sync against outbound peers
reorder peers filters so expensive filters come later

* filter peers by capabilities during sync

* prefer outbound peers with high total difficulty

* with_difficulty now takes a fn to allow more flexible comparisons based on difficulty

* rename peers_iter() -> iter()
This commit is contained in:
Antioch Peverell
2020-10-27 12:36:00 +00:00
committed by GitHub
parent cea546ceb8
commit 25fcefada2
13 changed files with 235 additions and 183 deletions
+3 -3
View File
@@ -345,11 +345,11 @@ impl DandelionEpoch {
/// Choose a new outbound stem relay peer.
pub fn next_epoch(&mut self, peers: &Arc<p2p::Peers>) {
self.start_time = Some(Utc::now().timestamp());
self.relay_peer = peers.outgoing_connected_peers().first().cloned();
self.relay_peer = peers.iter().outbound().connected().choose_random();
// If stem_probability == 90 then we stem 90% of the time.
let mut rng = rand::thread_rng();
let stem_probability = self.config.stem_probability;
let mut rng = rand::thread_rng();
self.is_stem = rng.gen_range(0, 100) < stem_probability;
let addr = self.relay_peer.clone().map(|p| p.info.addr);
@@ -386,7 +386,7 @@ impl DandelionEpoch {
}
if update_relay {
self.relay_peer = peers.outgoing_connected_peers().first().cloned();
self.relay_peer = peers.iter().outbound().connected().choose_random();
info!(
"DandelionEpoch: relay_peer: new peer chosen: {:?}",
self.relay_peer.clone().map(|p| p.info.addr)