mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-04-02 10:45:30 +00:00
udp: shard request workers by info hash
This commit is contained in:
parent
4addb0de49
commit
b617ff9d09
9 changed files with 378 additions and 218 deletions
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue