{"record":{"id":"edbafb1dddba08f8","repo":"quickwit-oss/quickwit","slug":"registering-a-signal-handler-for-sigint-should-not","errorCode":null,"errorMessage":"registering a signal handler for SIGINT should not fail","messagePattern":"registering a signal handler for SIGINT should not fail","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-cli/src/service.rs","lineNumber":56,"sourceCode":"        .arg(config_cli_arg())\n        .args(&[\n            arg!(--\"service\" <SERVICE> \"Services (`indexer`, `searcher`, `metastore`, `metastore-read-replica`, `control-plane`, or `janitor`) to run. If unspecified, services from the config are used.\")\n                .action(ArgAction::Append)\n                .required(false),\n        ])\n}\n\n#[derive(Debug, Eq, PartialEq)]\npub struct RunCliCommand {\n    pub config_uri: Uri,\n    pub services: Option<HashSet<QuickwitService>>,\n}\n\nasync fn listen_interrupt() {\n    async fn ctrl_c() {\n        signal::ctrl_c()\n            .await\n            .expect(\"registering a signal handler for SIGINT should not fail\");\n        // carriage return to hide the ^C echo from the terminal\n        print!(\"\\r\");\n    }\n    ctrl_c().await;\n    println!(\n        \"{} Graceful shutdown initiated. Waiting for ingested data to be indexed. This may take a \\\n         few minutes. Press Ctrl+C again to force shutdown.\",\n        \"❢\".color(BLUE_COLOR)\n    );\n    tokio::spawn(async {\n        ctrl_c().await;\n        println!(\n            \"{} Quickwit was forcefully shut down. Some data might not have been indexed.\",\n            \"✘\".color(RED_COLOR)\n        );\n        std::process::exit(1);\n    });\n}","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-cli/src/service.rs#L38-L74","documentation":"The CLI installs a tokio signal handler for Ctrl-C so a graceful shutdown can start. tokio::signal::ctrl_c() returns a Result that fails only if the handler cannot be registered (e.g. signals unavailable); the code asserts with expect that this never happens, since without a SIGINT handler the binary cannot shut down gracefully at all.","triggerScenarios":"tokio::signal::ctrl_c() returning Err while listen_interrupt spawns the ctrl_c task — practically only when OS signal delivery is unavailable (exotic sandbox/seccomp environments blocking signal registration).","commonSituations":"Running quickwit inside heavily restricted containers or sandboxes that disable signal syscalls; running under init systems that mask signal masks; embedded/minimal libc environments.","solutions":["Run quickwit in an environment where SIGINT handling is permitted (normal container/init systems allow it).","If signals are blocked, guard the registration: log the error and continue instead of panicking via expect.","Check seccomp/AppArmor policies and allow rt_sigaction/sigaltstack syscalls."],"exampleFix":"// before\nsignal::ctrl_c().await.expect(\"registering a signal handler for SIGINT should not fail\");\n// after\nif let Err(err) = signal::ctrl_c().await {\n    error!(error = ?err, \"failed to register SIGINT handler; graceful shutdown on Ctrl-C disabled\");\n    return;\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match signal::ctrl_c().await {\n    Ok(()) => initiate_graceful_shutdown(),\n    Err(err) => error!(error = ?err, \"SIGINT handler registration failed; continuing without it\"),\n}","preventionTips":["Run quickwit in standard runtimes (Docker, K8s, systemd) that permit signal registration.","Audit seccomp/AppArmor profiles for rt_sigaction when hardening containers.","Never swallow the panic in production builds without logging the OS error."],"tags":["cli","signals","panic"],"backgroundTag":"unsupported-platform","analyzedSha":"a39730c5cdcd1a4fe798403737ae293999ea21f8","analyzedAt":"2026-09-08T13:19:37.784Z","contentChangedAt":"2026-09-08T13:19:37.784Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}