udp: shard request workers by info hash

This commit is contained in:
Joakim Frostegård 2021-11-16 01:03:29 +01:00
parent 4addb0de49
commit b617ff9d09
9 changed files with 378 additions and 218 deletions

View file

@ -16,7 +16,7 @@ use crate::config::BenchConfig;
pub fn bench_announce_handler(
bench_config: &BenchConfig,
aquatic_config: &Config,
request_sender: &Sender<(ConnectedRequest, SocketAddr)>,
request_sender: &Sender<(SocketWorkerIndex, ConnectedRequest, SocketAddr)>,
response_receiver: &Receiver<(ConnectedResponse, SocketAddr)>,
rng: &mut impl Rng,
info_hashes: &[InfoHash],
@ -38,7 +38,11 @@ pub fn bench_announce_handler(
for request_chunk in requests.chunks(p) {
for (request, src) in request_chunk {
request_sender
.send((ConnectedRequest::Announce(request.clone()), *src))
.send((
SocketWorkerIndex(0),
ConnectedRequest::Announce(request.clone()),
*src,
))
.unwrap();
}

View file

@ -39,21 +39,17 @@ fn main() {
pub fn run(bench_config: BenchConfig) -> ::anyhow::Result<()> {
// Setup common state, spawn request handlers
let state = State::default();
let aquatic_config = Config::default();
let (request_sender, request_receiver) = unbounded();
let (response_sender, response_receiver) = unbounded();
for _ in 0..bench_config.num_threads {
let state = state.clone();
let config = aquatic_config.clone();
let request_receiver = request_receiver.clone();
let response_sender = response_sender.clone();
let response_sender = ConnectedResponseSender::new(vec![response_sender]);
::std::thread::spawn(move || {
run_request_worker(state, config, request_receiver, response_sender)
});
{
let config = aquatic_config.clone();
::std::thread::spawn(move || run_request_worker(config, request_receiver, response_sender));
}
// Run benchmarks

View file

@ -16,7 +16,7 @@ use crate::config::BenchConfig;
pub fn bench_scrape_handler(
bench_config: &BenchConfig,
aquatic_config: &Config,
request_sender: &Sender<(ConnectedRequest, SocketAddr)>,
request_sender: &Sender<(SocketWorkerIndex, ConnectedRequest, SocketAddr)>,
response_receiver: &Receiver<(ConnectedResponse, SocketAddr)>,
rng: &mut impl Rng,
info_hashes: &[InfoHash],
@ -42,20 +42,25 @@ 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 {
let request = ConnectedRequest::Scrape {
request: request.clone(),
original_indices: Vec::new(),
};
let request = ConnectedRequest::Scrape(PendingScrapeRequest {
transaction_id: request.transaction_id,
info_hashes: request
.info_hashes
.clone()
.into_iter()
.enumerate()
.collect(),
});
request_sender.send((request, *src)).unwrap();
request_sender
.send((SocketWorkerIndex(0), request, *src))
.unwrap();
}
while let Ok((ConnectedResponse::Scrape { response, .. }, _)) =
response_receiver.try_recv()
{
while let Ok((ConnectedResponse::Scrape(response), _)) = response_receiver.try_recv() {
num_responses += 1;
if let Some(stat) = response.torrent_stats.last() {
if let Some(stat) = response.torrent_stats.values().last() {
dummy ^= stat.leechers.0;
}
}
@ -64,10 +69,10 @@ pub fn bench_scrape_handler(
let total = bench_config.num_scrape_requests * (round + 1);
while num_responses < total {
if let Ok((ConnectedResponse::Scrape { response, .. }, _)) = response_receiver.recv() {
if let Ok((ConnectedResponse::Scrape(response), _)) = response_receiver.recv() {
num_responses += 1;
if let Some(stat) = response.torrent_stats.last() {
if let Some(stat) = response.torrent_stats.values().last() {
dummy ^= stat.leechers.0;
}
}