diff --git a/skald/src/serve.rs b/skald/src/serve.rs index 145accf..0af07cd 100644 --- a/skald/src/serve.rs +++ b/skald/src/serve.rs @@ -39,14 +39,23 @@ pub async fn run(database_url: &str, listen: &str) -> anyhow::Result<()> { let listener = tokio::net::TcpListener::bind(listen).await?; tracing::info!(listen, "api listening"); - let serve = axum::serve(listener, router).with_graceful_shutdown(shutdown()); - match tokio::time::timeout(Duration::from_secs(15), serve).await { - Ok(r) => r?, - Err(_) => tracing::warn!("graceful shutdown timed out after 15s — exiting anyway"), - } + // Run forever; exit only when SIGTERM/SIGINT signals the + // graceful-shutdown future. The shutdown future itself caps + // drain time so in-flight requests can't block exit forever. + axum::serve(listener, router) + .with_graceful_shutdown(shutdown_with_deadline()) + .await?; Ok(()) } +async fn shutdown_with_deadline() { + shutdown().await; + tracing::info!("graceful drain starting (15s deadline)"); + // 15s for in-flight requests to finish; then force-exit. + tokio::time::sleep(Duration::from_secs(15)).await; + tracing::warn!("graceful drain deadline elapsed — forcing exit"); +} + async fn shutdown() { let ctrl_c = async { let _ = tokio::signal::ctrl_c().await;