mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 17:55:36 +00:00
aquatic_udp: validate requests in socket workers
Also, don't send error responses for unconnected requests
This commit is contained in:
parent
fc90c71a56
commit
7616df9686
11 changed files with 88 additions and 259 deletions
|
|
@ -1,4 +1,4 @@
|
|||
use std::net::SocketAddr;
|
||||
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
|
|
@ -13,15 +13,14 @@ use crate::common::*;
|
|||
use crate::config::BenchConfig;
|
||||
|
||||
pub fn bench_announce_handler(
|
||||
state: &State,
|
||||
bench_config: &BenchConfig,
|
||||
aquatic_config: &Config,
|
||||
request_sender: &Sender<(Request, SocketAddr)>,
|
||||
request_sender: &Sender<(ConnectedRequest, SocketAddr)>,
|
||||
response_receiver: &Receiver<(Response, SocketAddr)>,
|
||||
rng: &mut impl Rng,
|
||||
info_hashes: &[InfoHash],
|
||||
) -> (usize, Duration) {
|
||||
let requests = create_requests(state, rng, info_hashes, bench_config.num_announce_requests);
|
||||
let requests = create_requests(rng, info_hashes, bench_config.num_announce_requests);
|
||||
|
||||
let p = aquatic_config.handlers.max_requests_per_iter * bench_config.num_threads;
|
||||
let mut num_responses = 0usize;
|
||||
|
|
@ -37,7 +36,7 @@ pub fn bench_announce_handler(
|
|||
for round in (0..bench_config.num_rounds).progress_with(pb) {
|
||||
for request_chunk in requests.chunks(p) {
|
||||
for (request, src) in request_chunk {
|
||||
request_sender.send((request.clone().into(), *src)).unwrap();
|
||||
request_sender.send((ConnectedRequest::Announce(request.clone()), *src)).unwrap();
|
||||
}
|
||||
|
||||
while let Ok((Response::Announce(r), _)) = response_receiver.try_recv() {
|
||||
|
|
@ -72,7 +71,6 @@ pub fn bench_announce_handler(
|
|||
}
|
||||
|
||||
pub fn create_requests(
|
||||
state: &State,
|
||||
rng: &mut impl Rng,
|
||||
info_hashes: &[InfoHash],
|
||||
number: usize,
|
||||
|
|
@ -83,15 +81,11 @@ pub fn create_requests(
|
|||
|
||||
let mut requests = Vec::new();
|
||||
|
||||
let connections = state.connections.lock();
|
||||
|
||||
let connection_keys: Vec<ConnectionKey> = connections.keys().take(number).cloned().collect();
|
||||
|
||||
for connection_key in connection_keys.into_iter() {
|
||||
for _ in 0..number {
|
||||
let info_hash_index = pareto_usize(rng, pareto, max_index);
|
||||
|
||||
let request = AnnounceRequest {
|
||||
connection_id: connection_key.connection_id,
|
||||
connection_id: ConnectionId(0),
|
||||
transaction_id: TransactionId(rng.gen()),
|
||||
info_hash: info_hashes[info_hash_index],
|
||||
peer_id: PeerId(rng.gen()),
|
||||
|
|
@ -105,7 +99,7 @@ pub fn create_requests(
|
|||
port: Port(rng.gen()),
|
||||
};
|
||||
|
||||
requests.push((request, connection_key.socket_addr));
|
||||
requests.push((request, SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 1))));
|
||||
}
|
||||
|
||||
requests
|
||||
|
|
|
|||
|
|
@ -1,80 +0,0 @@
|
|||
use std::time::{Duration, Instant};
|
||||
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
use indicatif::ProgressIterator;
|
||||
use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng};
|
||||
use std::net::SocketAddr;
|
||||
|
||||
use aquatic_udp::common::*;
|
||||
use aquatic_udp::config::Config;
|
||||
|
||||
use crate::common::*;
|
||||
use crate::config::BenchConfig;
|
||||
|
||||
pub fn bench_connect_handler(
|
||||
bench_config: &BenchConfig,
|
||||
aquatic_config: &Config,
|
||||
request_sender: &Sender<(Request, SocketAddr)>,
|
||||
response_receiver: &Receiver<(Response, SocketAddr)>,
|
||||
) -> (usize, Duration) {
|
||||
let requests = create_requests(bench_config.num_connect_requests);
|
||||
|
||||
let p = aquatic_config.handlers.max_requests_per_iter * bench_config.num_threads;
|
||||
let mut num_responses = 0usize;
|
||||
|
||||
let mut dummy: i64 = thread_rng().gen();
|
||||
|
||||
let pb = create_progress_bar("Connect", bench_config.num_rounds as u64);
|
||||
|
||||
// Start connect benchmark
|
||||
|
||||
let before = Instant::now();
|
||||
|
||||
for round in (0..bench_config.num_rounds).progress_with(pb) {
|
||||
for request_chunk in requests.chunks(p) {
|
||||
for (request, src) in request_chunk {
|
||||
request_sender.send((request.clone().into(), *src)).unwrap();
|
||||
}
|
||||
|
||||
while let Ok((Response::Connect(r), _)) = response_receiver.try_recv() {
|
||||
num_responses += 1;
|
||||
dummy ^= r.connection_id.0;
|
||||
}
|
||||
}
|
||||
|
||||
let total = bench_config.num_connect_requests * (round + 1);
|
||||
|
||||
while num_responses < total {
|
||||
if let Ok((Response::Connect(r), _)) = response_receiver.recv() {
|
||||
num_responses += 1;
|
||||
dummy ^= r.connection_id.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let elapsed = before.elapsed();
|
||||
|
||||
if dummy == 0 {
|
||||
println!("dummy dummy");
|
||||
}
|
||||
|
||||
(num_responses, elapsed)
|
||||
}
|
||||
|
||||
pub fn create_requests(number: usize) -> Vec<(ConnectRequest, SocketAddr)> {
|
||||
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
|
||||
|
||||
let mut requests = Vec::new();
|
||||
|
||||
for _ in 0..number {
|
||||
let request = ConnectRequest {
|
||||
transaction_id: TransactionId(rng.gen()),
|
||||
};
|
||||
|
||||
let src = SocketAddr::from(([rng.gen(), rng.gen(), rng.gen(), rng.gen()], rng.gen()));
|
||||
|
||||
requests.push((request, src));
|
||||
}
|
||||
|
||||
requests
|
||||
}
|
||||
|
|
@ -29,7 +29,6 @@ use config::BenchConfig;
|
|||
mod announce;
|
||||
mod common;
|
||||
mod config;
|
||||
mod connect;
|
||||
mod scrape;
|
||||
|
||||
#[global_allocator]
|
||||
|
|
@ -65,18 +64,10 @@ pub fn run(bench_config: BenchConfig) -> ::anyhow::Result<()> {
|
|||
|
||||
// Run benchmarks
|
||||
|
||||
let c = connect::bench_connect_handler(
|
||||
&bench_config,
|
||||
&aquatic_config,
|
||||
&request_sender,
|
||||
&response_receiver,
|
||||
);
|
||||
|
||||
let mut rng = SmallRng::from_rng(thread_rng()).unwrap();
|
||||
let info_hashes = create_info_hashes(&mut rng);
|
||||
|
||||
let a = announce::bench_announce_handler(
|
||||
&state,
|
||||
&bench_config,
|
||||
&aquatic_config,
|
||||
&request_sender,
|
||||
|
|
@ -86,7 +77,6 @@ pub fn run(bench_config: BenchConfig) -> ::anyhow::Result<()> {
|
|||
);
|
||||
|
||||
let s = scrape::bench_scrape_handler(
|
||||
&state,
|
||||
&bench_config,
|
||||
&aquatic_config,
|
||||
&request_sender,
|
||||
|
|
@ -100,7 +90,6 @@ pub fn run(bench_config: BenchConfig) -> ::anyhow::Result<()> {
|
|||
bench_config.num_rounds, bench_config.num_threads,
|
||||
);
|
||||
|
||||
print_results("Connect: ", c.0, c.1);
|
||||
print_results("Announce:", a.0, a.1);
|
||||
print_results("Scrape: ", s.0, s.1);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
use std::net::SocketAddr;
|
||||
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use crossbeam_channel::{Receiver, Sender};
|
||||
|
|
@ -13,16 +13,14 @@ use crate::common::*;
|
|||
use crate::config::BenchConfig;
|
||||
|
||||
pub fn bench_scrape_handler(
|
||||
state: &State,
|
||||
bench_config: &BenchConfig,
|
||||
aquatic_config: &Config,
|
||||
request_sender: &Sender<(Request, SocketAddr)>,
|
||||
request_sender: &Sender<(ConnectedRequest, SocketAddr)>,
|
||||
response_receiver: &Receiver<(Response, SocketAddr)>,
|
||||
rng: &mut impl Rng,
|
||||
info_hashes: &[InfoHash],
|
||||
) -> (usize, Duration) {
|
||||
let requests = create_requests(
|
||||
state,
|
||||
rng,
|
||||
info_hashes,
|
||||
bench_config.num_scrape_requests,
|
||||
|
|
@ -43,7 +41,7 @@ pub fn bench_scrape_handler(
|
|||
for round in (0..bench_config.num_rounds).progress_with(pb) {
|
||||
for request_chunk in requests.chunks(p) {
|
||||
for (request, src) in request_chunk {
|
||||
request_sender.send((request.clone().into(), *src)).unwrap();
|
||||
request_sender.send((ConnectedRequest::Scrape(request.clone()), *src)).unwrap();
|
||||
}
|
||||
|
||||
while let Ok((Response::Scrape(r), _)) = response_receiver.try_recv() {
|
||||
|
|
@ -78,7 +76,6 @@ pub fn bench_scrape_handler(
|
|||
}
|
||||
|
||||
pub fn create_requests(
|
||||
state: &State,
|
||||
rng: &mut impl Rng,
|
||||
info_hashes: &[InfoHash],
|
||||
number: usize,
|
||||
|
|
@ -88,13 +85,9 @@ pub fn create_requests(
|
|||
|
||||
let max_index = info_hashes.len() - 1;
|
||||
|
||||
let connections = state.connections.lock();
|
||||
|
||||
let connection_keys: Vec<ConnectionKey> = connections.keys().take(number).cloned().collect();
|
||||
|
||||
let mut requests = Vec::new();
|
||||
|
||||
for connection_key in connection_keys.into_iter() {
|
||||
for _ in 0..number {
|
||||
let mut request_info_hashes = Vec::new();
|
||||
|
||||
for _ in 0..hashes_per_request {
|
||||
|
|
@ -103,12 +96,12 @@ pub fn create_requests(
|
|||
}
|
||||
|
||||
let request = ScrapeRequest {
|
||||
connection_id: connection_key.connection_id,
|
||||
connection_id: ConnectionId(0),
|
||||
transaction_id: TransactionId(rng.gen()),
|
||||
info_hashes: request_info_hashes,
|
||||
};
|
||||
|
||||
requests.push((request, connection_key.socket_addr));
|
||||
requests.push((request, SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 1))));
|
||||
}
|
||||
|
||||
requests
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue