{"record":{"id":"4197e3ee7c7d4000","repo":"shadowsocks/shadowsocks-rust","slug":"create-tokio-runtime-4197e3","errorCode":null,"errorMessage":"create tokio Runtime","messagePattern":"create tokio Runtime","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"src/service/manager.rs","lineNumber":504,"sourceCode":"            })?;\n        }\n\n        info!(\"shadowsocks manager {} build {}\", crate::VERSION, crate::BUILD_TIME);\n\n        let mut builder = match service_config.runtime.mode {\n            RuntimeMode::SingleThread => Builder::new_current_thread(),\n            #[cfg(feature = \"multi-threaded\")]\n            RuntimeMode::MultiThread => {\n                let mut builder = Builder::new_multi_thread();\n                if let Some(worker_threads) = service_config.runtime.worker_count {\n                    builder.worker_threads(worker_threads);\n                }\n\n                builder\n            }\n        };\n\n        let runtime = builder.enable_all().build().expect(\"create tokio Runtime\");\n\n        (config, runtime)\n    };\n\n    let main_fut = async move {\n        let abort_signal = monitor::create_signal_monitor();\n        let server = run_manager(config);\n\n        tokio::pin!(abort_signal);\n        tokio::pin!(server);\n\n        match future::select(server, abort_signal).await {\n            // Server future resolved without an error. This should never happen.\n            Either::Left((Ok(..), ..)) => Err(ShadowsocksError::ServerExitUnexpectedly(\n                \"server exited unexpectedly\".to_owned(),\n            )),\n            // Server future resolved with error, which are listener errors in most cases\n            Either::Left((Err(err), ..)) => Err(ShadowsocksError::ServerAborted(format!(\"server aborted with {err}\"))),","sourceCodeStart":486,"sourceCodeEnd":522,"githubUrl":"https://github.com/shadowsocks/shadowsocks-rust/blob/8eb0f0a65b1d976ab6bed5787327ef86529b0435/src/service/manager.rs#L486-L522","documentation":"Identical to the local-service runtime build: the manager service `create` calls `builder.enable_all().build().expect(\"create tokio Runtime\")`. The panic means tokio's Runtime could not be constructed from the given Builder — invalid worker-thread counts or failure to spawn OS threads. Occurs before the manager starts serving.","triggerScenarios":"`Builder::build()` returning Err inside manager `create` (called from `main`): `--worker-threads 0`, or thread-spawn IO errors under restrictive cgroup/pid limits.","commonSituations":"Setting worker threads to 0 in scripts; constrained Docker/Kubernetes pods hitting pids limits; hardened rlimits.","solutions":["Correct the `--worker-threads` value (>= 1) or drop the flag for defaults","Raise container/rlimit thread (pids) limits","Let tokio use its default multi-thread runtime configuration","Update shadowsocks-rust/tokio versions if platform-specific build bugs apply"],"exampleFix":"// before\nssmanager --worker-threads 0 ...\n// after\nssmanager ...  # omit --worker-threads","handlingStrategy":"validation","validationCode":"// ensure worker-threads is sane before launch\nif let Some(n) = cli.worker_threads {\n    assert!(n >= 1, \"--worker-threads must be >= 1, got {n}\");\n}","typeGuard":"fn valid_worker_count(n: u64) -> bool { (1..=1024).contains(&n) }","tryCatchPattern":"// expect-panic is fatal; surface it via a friendly startup wrapper\nstd::panic::set_hook(Box::new(|i| eprintln!(\"startup failed: {i}\")));","preventionTips":["Omit --worker-threads unless necessary","Raise container pids limits for dense deployments","Smoke-test startup commands in CI"],"tags":["tokio","runtime","startup","panic"],"backgroundTag":"module-init-failed","analyzedSha":"8eb0f0a65b1d976ab6bed5787327ef86529b0435","analyzedAt":"2026-09-09T12:20:43.168Z","contentChangedAt":"2026-09-09T12:20:43.168Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}