#![allow(clippy::unwrap_used, clippy::cast_precision_loss)]
mod common;
use std::net::SocketAddr;
use std::sync::mpsc;
use common::{build_handler, payload, run_cell, serve, start_upstream};
use osproxy_server::tenancy::PlacementMode;
const PAYLOADS: &[(&str, usize)] = &[("256B", 256), ("4KB", 4096), ("64KB", 65536)];
const CONNS: &[usize] = &[1, 8];
const REQS_PER_CONN: usize = 100;
fn spawn_server_side() -> (SocketAddr, SocketAddr) {
let (tx, rx) = mpsc::channel();
std::thread::spawn(move || {
let rt = tokio::runtime::Builder::new_multi_thread()
.worker_threads(4)
.enable_all()
.build()
.unwrap();
rt.block_on(async move {
let upstream = start_upstream().await;
let upstream_addr: SocketAddr = upstream.trim_start_matches("http://").parse().unwrap();
let proxy = serve(build_handler(&upstream, Some(PlacementMode::SharedIndex))).await;
tx.send((upstream_addr, proxy)).unwrap();
std::future::pending::<()>().await;
});
});
rx.recv().unwrap()
}
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
#[ignore = "proxy-overhead differential; run with --ignored --nocapture"]
async fn proxy_added_latency_by_payload() {
let (upstream, proxy) = spawn_server_side();
let bodies: Vec<(&str, bytes::Bytes)> =
PAYLOADS.iter().map(|&(l, s)| (l, payload(s))).collect();
println!("proxy ADDED latency = proxied − direct (ms); per-request overhead, harness cancels");
println!(
"{:<6} {:>5} | {:>14} | {:>14} | {:>14}",
"size", "conns", "direct p50/p99", "proxied p50/p99", "ADDED p50/p99"
);
for (label, body) in &bodies {
for &conns in CONNS {
let (_, dp50, dp99) = run_cell(upstream, "/", body.clone(), conns, REQS_PER_CONN).await;
let (_, pp50, pp99) =
run_cell(proxy, "/orders/_doc", body.clone(), conns, REQS_PER_CONN).await;
println!(
"{label:<6} {conns:>5} | {dp50:>6.3} {dp99:>6.3} | {pp50:>6.3} {pp99:>6.3} | {:>6.3} {:>6.3}",
pp50 - dp50,
pp99 - dp99
);
}
}
}