use qail_core::ast::Qail;
use qail_pg::driver::PgDriver;
use std::sync::Arc;
use tokio::sync::Semaphore;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("๐งช Test 6: Pool Starvation");
println!("{}", "โ".repeat(40));
let max_connections = 1;
let task_count = 50;
let semaphore = Arc::new(Semaphore::new(max_connections));
println!(" Pool size: {} connection(s)", max_connections);
println!(" Concurrent tasks: {}", task_count);
println!(" Starting tasks...");
let start = std::time::Instant::now();
let mut handles = vec![];
for i in 0..task_count {
let sem = semaphore.clone();
handles.push(tokio::spawn(async move {
let _permit = sem.acquire().await.unwrap();
let mut driver = PgDriver::connect("localhost", 5432, "orion", "postgres")
.await
.expect("Connection failed");
let sleep = Qail::do_block("BEGIN PERFORM pg_sleep(0.01); END;", "plpgsql");
driver.execute(&sleep).await.expect("Query failed");
if i % 10 == 0 {
println!(" Task {} completed", i);
}
}));
}
for handle in handles {
handle.await?;
}
let elapsed = start.elapsed();
println!();
println!(" โ All {} tasks completed in {:?}", task_count, elapsed);
println!(
" Expected ~{:.1}s (50 tasks ร 10ms each)",
task_count as f64 * 0.01
);
println!();
println!("โ Pool Starvation Test PASSED!");
Ok(())
}