ws: refactor, bug fixes, improvements (#155)

- split swarm worker into two modules
- split socket worker into two modules
- keep track of which offers peers have sent and only allow matching
answers
- always clean up after closing connection
- use channel for telling connections to close
- move some logic into new ConnectionRunner struct
- use slotmap for connection reference storage
- fix double counting of error responses
- actually close connections that take too long to send responses to
- remove announced_info_hashes entry on AnnounceEvent::Stopped
This commit is contained in:
Joakim Frostegård 2023-11-09 18:06:21 +01:00 committed by GitHub
parent af9d5a55f6
commit fe5ccf6646
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 1770 additions and 1583 deletions

View file

@ -156,7 +156,7 @@ pub fn extract_response_peers<K, V, R, F>(
) -> Vec<R>
where
K: Eq + ::std::hash::Hash,
F: Fn(&V) -> R,
F: Fn(&K, &V) -> R,
{
if peer_map.len() <= max_num_peers_to_take + 1 {
// This branch: number of peers in map (minus sender peer) is less than
@ -165,7 +165,7 @@ where
let mut peers = Vec::with_capacity(peer_map.len());
peers.extend(peer_map.iter().filter_map(|(k, v)| {
(*k != sender_peer_map_key).then_some(peer_conversion_function(v))
(*k != sender_peer_map_key).then_some(peer_conversion_function(k, v))
}));
// Handle the case when sender peer is not in peer list. Typically,
@ -204,12 +204,12 @@ where
if let Some(slice) = peer_map.get_range(offset_half_one..end_half_one) {
peers.extend(slice.iter().filter_map(|(k, v)| {
(*k != sender_peer_map_key).then_some(peer_conversion_function(v))
(*k != sender_peer_map_key).then_some(peer_conversion_function(k, v))
}));
}
if let Some(slice) = peer_map.get_range(offset_half_two..end_half_two) {
peers.extend(slice.iter().filter_map(|(k, v)| {
(*k != sender_peer_map_key).then_some(peer_conversion_function(v))
(*k != sender_peer_map_key).then_some(peer_conversion_function(k, v))
}));
}
@ -260,7 +260,7 @@ mod tests {
&peer_map,
max_num_peers_to_take,
sender_peer_map_key,
|p| *p,
|_, p| *p,
);
if num_peers_in_map > max_num_peers_to_take + 1 {