From a20a270694a8c9fda3496a6e90effcf78ea98db8 Mon Sep 17 00:00:00 2001 From: Raphael Date: Mon, 24 Aug 2026 17:19:52 +0200 Subject: [PATCH 1/2] feat: added shutdown signal --- gateway/src/main.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/gateway/src/main.rs b/gateway/src/main.rs index 7038177d..ee6b6662 100644 --- a/gateway/src/main.rs +++ b/gateway/src/main.rs @@ -114,12 +114,38 @@ async fn run(config: Config) -> anyhow::Result<()> { } log::info!("Sagittarius gateway listening on {}", address); - server_builder.serve(address).await?; + server_builder + .serve_with_shutdown(address, shutdown_signal()) + .await?; log::info!("Sagittarius gateway stopped"); Ok(()) } +/// Resolves once a Ctrl+C (SIGINT) or SIGTERM is received, so the caller can +/// pass it to `serve_with_shutdown` for a graceful stop. +async fn shutdown_signal() { + #[cfg(unix)] + let sigterm = async { + use tokio::signal::unix::{SignalKind, signal}; + + let mut term = signal(SignalKind::terminate()).expect("failed to install SIGTERM handler"); + term.recv().await; + }; + + #[cfg(not(unix))] + let sigterm = std::future::pending::<()>(); + + tokio::select! { + _ = tokio::signal::ctrl_c() => { + log::info!("Ctrl+C/Exit signal received, shutting down"); + } + _ = sigterm => { + log::info!("SIGTERM received, shutting down"); + } + } +} + fn install_panic_logging() { std::panic::set_hook(Box::new(move |panic_info| { let message = if let Some(message) = panic_info.payload().downcast_ref::<&str>() { From b6836383f5f236047cee48d2a891b2e22a4f9f26 Mon Sep 17 00:00:00 2001 From: Raphael Date: Mon, 24 Aug 2026 17:20:00 +0200 Subject: [PATCH 2/2] deps: activated signal from tokio --- Cargo.lock | 11 +++++++++++ Cargo.toml | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 6e6ae5ff..dd95145a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1911,6 +1911,16 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -2126,6 +2136,7 @@ dependencies = [ "libc", "mio", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys", diff --git a/Cargo.toml b/Cargo.toml index f3c3d1be..7e60caad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ code0-flow = { version = "0.0.44", features = ["flow_telemetry"] } jsonwebtoken = { version = "11.0.0", features = ["rust_crypto"] } log = "0.4.33" serde = { version = "1.0.228", features = ["derive"] } -tokio = { version = "1.52.3", features = ["macros", "rt-multi-thread", "sync"] } +tokio = { version = "1.52.3", features = ["macros", "rt-multi-thread", "signal", "sync"] } tokio-stream = "0.1.18" tonic = "0.14.6" tonic-health = "0.14.6"