{"record":{"id":"6438d068e9e2122f","repo":"shadowsocks/shadowsocks-rust","slug":"balancer-max-server-rtt-must-be-0","errorCode":null,"errorMessage":"balancer.max_server_rtt must be > 0","messagePattern":"balancer\\.max_server_rtt must be > 0","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/shadowsocks-service/src/config.rs","lineNumber":2869,"sourceCode":"        if self.config_type.is_local() {\n            if self.local.is_empty() {\n                let err = Error::new(\n                    ErrorKind::MissingField,\n                    \"missing `locals` for client configuration\",\n                    None,\n                );\n                return Err(err);\n            }\n\n            for local_config in &self.local {\n                local_config.config.check_integrity()?;\n            }\n\n            // Balancer related checks\n            if let Some(rtt) = self.balancer.max_server_rtt\n                && rtt.as_secs() == 0\n            {\n                let err = Error::new(ErrorKind::Invalid, \"balancer.max_server_rtt must be > 0\", None);\n                return Err(err);\n            }\n\n            if let Some(intv) = self.balancer.check_interval\n                && intv.as_secs() == 0\n            {\n                let err = Error::new(ErrorKind::Invalid, \"balancer.check_interval must be > 0\", None);\n                return Err(err);\n            }\n        }\n\n        if self.config_type.is_server() && self.server.is_empty() {\n            let err = Error::new(\n                ErrorKind::MissingField,\n                \"missing any valid servers in configuration\",\n                None,\n            );\n            return Err(err);","sourceCodeStart":2851,"sourceCodeEnd":2887,"githubUrl":"https://github.com/shadowsocks/shadowsocks-rust/blob/8eb0f0a65b1d976ab6bed5787327ef86529b0435/crates/shadowsocks-service/src/config.rs#L2851-L2887","documentation":"During shadowsocks-service configuration validation (Config::check), if balancer.max_server_rtt is set it must represent a duration strictly greater than zero seconds. A zero (or sub-second zero) value would make the balancer's RTT-based server selection logic meaningless, so the config is rejected with ErrorKind::Invalid.","triggerScenarios":"Loading or building a Config with config_type local (balancer enabled) where the [balancer] max_server_rtt field is present in the config file/URL but parsed as 0 seconds, e.g. max_server_rtt = 0 or an invalid duration that normalizes to zero, followed by Config::check()/from loading.","commonSituations":"Hand-edited TOML/JSON config files where the author set max_server_rtt = 0 intending 'unlimited' or 'disabled'; copy-pasted config snippets with placeholder 0 values; URL-based config (ss:// or SIP002/SIP008 plugin params) with rtt=0.","solutions":["Set max_server_rtt to a positive duration in your config, e.g. max_server_rtt = \"500ms\" or a value > 0 seconds.","If you do not want an RTT cap, remove the max_server_rtt key entirely so the check is skipped (it is only validated when Some).","If the value comes from a generated config/URL source, fix the generator to omit or correctly compute the RTT value."],"exampleFix":"// before (config.toml)\n[balancer]\nmax_server_rtt = 0\n\n// after\n[balancer]\nmax_server_rtt = \"500ms\"","handlingStrategy":"validation","validationCode":"// Rust: before loading config\nif let Some(rtt) = balancer_max_server_rtt {\n    assert!(rtt.as_secs() > 0 || rtt.subsec_nanos() > 0, \"max_server_rtt must be > 0\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never set duration fields to 0 to mean 'disabled' — omit the key instead.","Express sub-second values with explicit units (\"500ms\") to avoid unit confusion.","Lint generated configs for zero durations before deployment."],"tags":["config","validation","balancer","shadowsocks"],"backgroundTag":"invalid-config-value","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"}