mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-02 10:45:30 +00:00
aquatic: handler: put responses in vector, send after releasing lock
This commit is contained in:
parent
16155f3de5
commit
f8713c09c1
2 changed files with 28 additions and 20 deletions
2
TODO.md
2
TODO.md
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
## aquatic
|
## aquatic
|
||||||
* `thread 'main' panicked at 'overflow when subtracting duration from instant', src/libstd/time.rs:374:9`
|
* `thread 'main' panicked at 'overflow when subtracting duration from instant', src/libstd/time.rs:374:9`
|
||||||
* Handler: put responses in vector and send them all together after releasing
|
|
||||||
lock?
|
|
||||||
* Use bounded request channel?
|
* Use bounded request channel?
|
||||||
* Handle Ipv4 and Ipv6 peers. Probably split state. Ipv4 peers can't make
|
* Handle Ipv4 and Ipv6 peers. Probably split state. Ipv4 peers can't make
|
||||||
use of Ipv6 ones. Ipv6 ones may or may note be able to make use of Ipv4
|
use of Ipv6 ones. Ipv6 ones may or may note be able to make use of Ipv4
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@ pub fn handle(
|
||||||
let mut announce_requests: Vec<(AnnounceRequest, SocketAddr)> = Vec::new();
|
let mut announce_requests: Vec<(AnnounceRequest, SocketAddr)> = Vec::new();
|
||||||
let mut scrape_requests: Vec<(ScrapeRequest, SocketAddr)> = Vec::new();
|
let mut scrape_requests: Vec<(ScrapeRequest, SocketAddr)> = Vec::new();
|
||||||
|
|
||||||
|
let mut responses: Vec<(Response, SocketAddr)> = Vec::new();
|
||||||
|
|
||||||
let mut std_rng = StdRng::from_entropy();
|
let mut std_rng = StdRng::from_entropy();
|
||||||
let mut small_rng = SmallRng::from_rng(&mut std_rng).unwrap();
|
let mut small_rng = SmallRng::from_rng(&mut std_rng).unwrap();
|
||||||
|
|
||||||
|
|
@ -80,7 +82,7 @@ pub fn handle(
|
||||||
&mut data,
|
&mut data,
|
||||||
&mut std_rng,
|
&mut std_rng,
|
||||||
connect_requests.drain(..),
|
connect_requests.drain(..),
|
||||||
&response_sender
|
&mut responses
|
||||||
);
|
);
|
||||||
|
|
||||||
handle_announce_requests(
|
handle_announce_requests(
|
||||||
|
|
@ -88,13 +90,21 @@ pub fn handle(
|
||||||
&config,
|
&config,
|
||||||
&mut small_rng,
|
&mut small_rng,
|
||||||
announce_requests.drain(..),
|
announce_requests.drain(..),
|
||||||
&response_sender
|
&mut responses
|
||||||
);
|
);
|
||||||
handle_scrape_requests(
|
handle_scrape_requests(
|
||||||
&mut data,
|
&mut data,
|
||||||
scrape_requests.drain(..),
|
scrape_requests.drain(..),
|
||||||
&response_sender
|
&mut responses
|
||||||
);
|
);
|
||||||
|
|
||||||
|
::std::mem::drop(data);
|
||||||
|
|
||||||
|
for r in responses.drain(..){
|
||||||
|
if let Err(err) = response_sender.send(r){
|
||||||
|
eprintln!("error sending response to channel: {}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,11 +114,11 @@ pub fn handle_connect_requests(
|
||||||
data: &mut MutexGuard<HandlerData>,
|
data: &mut MutexGuard<HandlerData>,
|
||||||
rng: &mut StdRng,
|
rng: &mut StdRng,
|
||||||
requests: Drain<(ConnectRequest, SocketAddr)>,
|
requests: Drain<(ConnectRequest, SocketAddr)>,
|
||||||
response_sender: &Sender<(Response, SocketAddr)>,
|
responses: &mut Vec<(Response, SocketAddr)>,
|
||||||
){
|
){
|
||||||
let now = Time(Instant::now());
|
let now = Time(Instant::now());
|
||||||
|
|
||||||
for (request, src) in requests {
|
responses.extend(requests.map(|(request, src)| {
|
||||||
let connection_id = ConnectionId(rng.gen());
|
let connection_id = ConnectionId(rng.gen());
|
||||||
|
|
||||||
let key = ConnectionKey {
|
let key = ConnectionKey {
|
||||||
|
|
@ -125,8 +135,8 @@ pub fn handle_connect_requests(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
response_sender.send((response, src));
|
(response, src)
|
||||||
}
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -136,9 +146,9 @@ pub fn handle_announce_requests(
|
||||||
config: &Config,
|
config: &Config,
|
||||||
rng: &mut SmallRng,
|
rng: &mut SmallRng,
|
||||||
requests: Drain<(AnnounceRequest, SocketAddr)>,
|
requests: Drain<(AnnounceRequest, SocketAddr)>,
|
||||||
response_sender: &Sender<(Response, SocketAddr)>,
|
responses: &mut Vec<(Response, SocketAddr)>,
|
||||||
){
|
){
|
||||||
for (request, src) in requests {
|
responses.extend(requests.map(|(request, src)| {
|
||||||
let connection_key = ConnectionKey {
|
let connection_key = ConnectionKey {
|
||||||
connection_id: request.connection_id,
|
connection_id: request.connection_id,
|
||||||
socket_addr: src,
|
socket_addr: src,
|
||||||
|
|
@ -150,7 +160,7 @@ pub fn handle_announce_requests(
|
||||||
message: "Connection invalid or expired".to_string()
|
message: "Connection invalid or expired".to_string()
|
||||||
};
|
};
|
||||||
|
|
||||||
response_sender.send((response.into(), src));
|
return (response.into(), src);
|
||||||
}
|
}
|
||||||
|
|
||||||
let peer_key = PeerMapKey {
|
let peer_key = PeerMapKey {
|
||||||
|
|
@ -161,7 +171,7 @@ pub fn handle_announce_requests(
|
||||||
let peer = Peer::from_announce_and_ip(&request, src.ip());
|
let peer = Peer::from_announce_and_ip(&request, src.ip());
|
||||||
let peer_status = peer.status;
|
let peer_status = peer.status;
|
||||||
|
|
||||||
let mut torrent_data = data.torrents
|
let torrent_data = data.torrents
|
||||||
.entry(request.info_hash)
|
.entry(request.info_hash)
|
||||||
.or_default();
|
.or_default();
|
||||||
|
|
||||||
|
|
@ -210,8 +220,8 @@ pub fn handle_announce_requests(
|
||||||
peers: response_peers
|
peers: response_peers
|
||||||
});
|
});
|
||||||
|
|
||||||
response_sender.send((response, src));
|
(response, src)
|
||||||
}
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -219,11 +229,11 @@ pub fn handle_announce_requests(
|
||||||
pub fn handle_scrape_requests(
|
pub fn handle_scrape_requests(
|
||||||
data: &mut MutexGuard<HandlerData>,
|
data: &mut MutexGuard<HandlerData>,
|
||||||
requests: Drain<(ScrapeRequest, SocketAddr)>,
|
requests: Drain<(ScrapeRequest, SocketAddr)>,
|
||||||
response_sender: &Sender<(Response, SocketAddr)>,
|
responses: &mut Vec<(Response, SocketAddr)>,
|
||||||
){
|
){
|
||||||
let empty_stats = create_torrent_scrape_statistics(0, 0);
|
let empty_stats = create_torrent_scrape_statistics(0, 0);
|
||||||
|
|
||||||
for (request, src) in requests {
|
responses.extend(requests.map(|(request, src)|{
|
||||||
let connection_key = ConnectionKey {
|
let connection_key = ConnectionKey {
|
||||||
connection_id: request.connection_id,
|
connection_id: request.connection_id,
|
||||||
socket_addr: src,
|
socket_addr: src,
|
||||||
|
|
@ -235,7 +245,7 @@ pub fn handle_scrape_requests(
|
||||||
message: "Connection invalid or expired".to_string()
|
message: "Connection invalid or expired".to_string()
|
||||||
};
|
};
|
||||||
|
|
||||||
response_sender.send((response.into(), src));
|
return (response.into(), src);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut stats: Vec<TorrentScrapeStatistics> = Vec::with_capacity(
|
let mut stats: Vec<TorrentScrapeStatistics> = Vec::with_capacity(
|
||||||
|
|
@ -258,8 +268,8 @@ pub fn handle_scrape_requests(
|
||||||
torrent_stats: stats,
|
torrent_stats: stats,
|
||||||
});
|
});
|
||||||
|
|
||||||
response_sender.send((response, src));
|
(response, src)
|
||||||
};
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue