blob: 1e0e247a9f76b8c50b18e1ad3d19a3854902f7d1 [file] [log] [blame]
use crate::args::common::IggyBenchArgs;
use crate::benchmark_result::BenchmarkResults;
use crate::benchmarks::benchmark::Benchmarkable;
use crate::server_starter::start_server_if_needed;
use futures::future::select_all;
use iggy::error::IggyError;
use integration::test_server::TestServer;
use std::time::Duration;
use tokio::time::sleep;
use tracing::info;
pub struct BenchmarkRunner {
args: Option<IggyBenchArgs>,
test_server: Option<TestServer>,
}
impl BenchmarkRunner {
pub fn new(args: IggyBenchArgs) -> Self {
Self {
args: Some(args),
test_server: None,
}
}
pub async fn run(&mut self) -> Result<(), IggyError> {
let mut args = self.args.take().unwrap();
self.test_server = start_server_if_needed(&mut args).await;
let transport = args.transport();
let server_addr = args.server_address();
info!("Starting to benchmark: {transport} with server: {server_addr}",);
let mut benchmark: Box<dyn Benchmarkable> = args.into();
let mut join_handles = benchmark.run().await?;
let mut results = Vec::new();
while !join_handles.is_empty() {
let (result, _index, remaining) = select_all(join_handles).await;
join_handles = remaining;
match result {
Ok(r) => results.push(r),
Err(e) => return Err(e),
}
}
// Sleep just to see result prints after all the join handles are done and tcp connections are closed
sleep(Duration::from_millis(10)).await;
let results: BenchmarkResults = results.into();
benchmark.display_settings();
results
.to_string()
.split('\n')
.for_each(|result| info!("{}", result));
Ok(())
}
}