use clap::Parser;
use ktstr::workload::{TaobenchConfig, TaobenchStandaloneReport, taobench_run_standalone};
#[derive(Parser)]
#[command(
name = "ktstr-taobench-validate",
about = "Run the native taobench_rs engine host-side and print a taobench-comparable qps/hit-ratio report"
)]
struct Args {
#[arg(short = 'c', long, default_value_t = 0)]
client_threads: usize,
#[arg(short = 's', long, default_value_t = 0)]
slow_threads: usize,
#[arg(short = 'm', long, default_value_t = 64)]
cache_capacity_mib: usize,
#[arg(short = 'H', long, default_value_t = 90)]
target_hit_pct: usize,
#[arg(short = 'u', long, default_value_t = 100)]
slow_path_sleep_us: u64,
#[arg(short = 'p', long, default_value_t = 0)]
slow_path_p99_us: u64,
#[arg(short = 'r', long, default_value_t = 30)]
runtime_secs: u64,
#[arg(short = 'R', long, default_value_t = 0)]
arrival_rate: usize,
}
fn main() {
let args = Args::parse();
let config = TaobenchConfig::default()
.client_threads(args.client_threads)
.slow_threads(args.slow_threads)
.cache_capacity_mib(args.cache_capacity_mib)
.target_hit_pct(args.target_hit_pct)
.slow_path_sleep_us(args.slow_path_sleep_us)
.slow_path_p99_us(args.slow_path_p99_us)
.arrival_rate(args.arrival_rate);
let report = taobench_run_standalone(&config, args.runtime_secs);
print_report(&report, args.runtime_secs);
}
fn print_report(r: &TaobenchStandaloneReport, runtime_secs: u64) {
println!(
"taobench_rs standalone — runtime {runtime_secs}s, {} client threads, {} slow dispatchers, {:.2}s measured window",
r.nr_client_threads, r.nr_slow_threads, r.elapsed_secs
);
println!("total_qps = {:.1}", r.total_qps);
println!("fast_qps = {:.1}", r.fast_qps);
println!("slow_qps = {:.1}", r.slow_qps);
println!("hit_ratio = {:.4} (fast / (fast + slow))", r.hit_ratio);
println!(
"hit_rate = {:.4} (1 - get_misses / get_cmds, command-time)",
r.hit_rate
);
println!(
"ops: total={} fast={} slow={}",
r.total_ops, r.fast_ops, r.slow_ops
);
if let (Some(p50), Some(p99), Some(p999), Some(min), Some(max)) = (
r.serve_p50_us,
r.serve_p99_us,
r.serve_p999_us,
r.serve_min_us,
r.serve_max_us,
) {
println!(
"serve_us (coordinated-omission, from intended arrival): min={min} p50={p50} p99={p99} p99.9={p999} max={max}"
);
}
}