diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-03 22:22:53 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-03 22:22:53 +0000 |
| commit | e0ad39a489b3398f8208713bf728db0cb11475b0 (patch) | |
| tree | 34f9ce47908985259a2a24efa2468e9743b94e2f /src | |
| parent | 61e9b8a111f932d2753c18c8435b74e01ae4a2e3 (diff) | |
Handle SIGTERM for graceful shutdown with systemd
Listen for both SIGINT (Ctrl+C) and SIGTERM (systemd) signals to ensure
graceful shutdown cleanup runs when stopping the service via systemd.
Previously, only SIGINT was handled, causing purgatory state and rejected
events cache to be lost on every systemd restart. Now both signals trigger
the cleanup code that saves state files and removes placeholder refs.
Fixes issue 0f73
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs index 6c9da05..dd2c903 100644 --- a/src/main.rs +++ b/src/main.rs | |||
| @@ -207,18 +207,45 @@ async fn main() -> Result<()> { | |||
| 207 | info!("Starting HTTP server on {}", config.bind_address); | 207 | info!("Starting HTTP server on {}", config.bind_address); |
| 208 | 208 | ||
| 209 | // Run server until shutdown signal, then cleanup | 209 | // Run server until shutdown signal, then cleanup |
| 210 | tokio::select! { | 210 | #[cfg(unix)] |
| 211 | result = http::run_server( | 211 | { |
| 212 | config, | 212 | use tokio::signal::unix::{signal, SignalKind}; |
| 213 | relay_with_db.relay, | 213 | let mut sigterm = signal(SignalKind::terminate())?; |
| 214 | relay_with_db.database, | 214 | |
| 215 | metrics, | 215 | tokio::select! { |
| 216 | purgatory, | 216 | result = http::run_server( |
| 217 | ) => { | 217 | config, |
| 218 | result? | 218 | relay_with_db.relay, |
| 219 | relay_with_db.database, | ||
| 220 | metrics, | ||
| 221 | purgatory, | ||
| 222 | ) => { | ||
| 223 | result? | ||
| 224 | } | ||
| 225 | _ = signal::ctrl_c() => { | ||
| 226 | info!("Received SIGINT (Ctrl+C), cleaning up..."); | ||
| 227 | } | ||
| 228 | _ = sigterm.recv() => { | ||
| 229 | info!("Received SIGTERM, cleaning up..."); | ||
| 230 | } | ||
| 219 | } | 231 | } |
| 220 | _ = signal::ctrl_c() => { | 232 | } |
| 221 | info!("Received shutdown signal, cleaning up..."); | 233 | |
| 234 | #[cfg(not(unix))] | ||
| 235 | { | ||
| 236 | tokio::select! { | ||
| 237 | result = http::run_server( | ||
| 238 | config, | ||
| 239 | relay_with_db.relay, | ||
| 240 | relay_with_db.database, | ||
| 241 | metrics, | ||
| 242 | purgatory, | ||
| 243 | ) => { | ||
| 244 | result? | ||
| 245 | } | ||
| 246 | _ = signal::ctrl_c() => { | ||
| 247 | info!("Received SIGINT (Ctrl+C), cleaning up..."); | ||
| 248 | } | ||
| 222 | } | 249 | } |
| 223 | } | 250 | } |
| 224 | 251 | ||