Queuing only peers that will be retried

This commit is contained in:
Ivan 2024-09-26 21:30:25 +02:00
parent a31e8344b2
commit cd7349121c
2 changed files with 41 additions and 12 deletions

View file

@ -784,18 +784,17 @@ impl TorrentStateLive {
} }
pub(crate) fn reconnect_all_not_needed_peers(&self) { pub(crate) fn reconnect_all_not_needed_peers(&self) {
for mut pe in self.peers.states.iter_mut() { self.peers
if pe.state.not_needed_to_queued(&self.peer_stats()) { .states
let retry_addr = match pe.value().outgoing_address { .iter_mut()
peer::OutgoingAddressType::Default => *pe.key(), .filter_map(|mut p| {
peer::OutgoingAddressType::None => continue, let known_addr = *p.key();
peer::OutgoingAddressType::Known(socket_addr) => socket_addr, p.value_mut()
}; .reconnect_not_needed_peer(known_addr, &self.peer_stats())
if self.peer_queue_tx.send(retry_addr).is_err() { })
return; .map(|socket_addr| self.peer_queue_tx.send(socket_addr))
} .take_while(|r| r.is_ok())
} .last();
}
} }
} }

View file

@ -48,6 +48,36 @@ impl Peer {
outgoing_address: OutgoingAddressType::None, outgoing_address: OutgoingAddressType::None,
} }
} }
pub(crate) fn reconnect_not_needed_peer(
&mut self,
known_address: SocketAddr,
counters: &[&AggregatePeerStatsAtomic],
) -> Option<SocketAddr> {
if let PeerState::NotNeeded = self.state.get() {
match self.outgoing_address {
OutgoingAddressType::Default => {
self.state.set(PeerState::Queued, counters);
Some(known_address)
}
OutgoingAddressType::None => None,
OutgoingAddressType::Known(socket_addr) => {
if known_address == socket_addr {
self.state.set(PeerState::Queued, counters);
}
Some(socket_addr)
},
}
} else {
None
}
// pe.state.not_needed_to_queued(&self.peer_stats()) {
// let retry_addr = match pe.value().outgoing_address {
// peer::OutgoingAddressType::Default => *pe.key(),
// peer::OutgoingAddressType::None => unreachable!("bug"), // already filtered
// peer::OutgoingAddressType::Known(socket_addr) => socket_addr,
// };
}
} }
#[derive(Debug, Default)] #[derive(Debug, Default)]