{"record":{"id":"32b96e8f1bf04abd","repo":"linera-io/linera-protocol","slug":"failed-to-find-parse-port-port-str-for-s-par","errorCode":null,"errorMessage":"Failed to find parse port {port_str} for {s}. {parse_error}","messagePattern":"Failed to find parse port (.+?) for (.+?)\\. (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"linera-storage-runtime/src/storage_config.rs","lineNumber":194,"sourceCode":"        }\n        #[cfg(feature = \"scylladb\")]\n        if let Some(s) = input.strip_prefix(SCYLLA_DB) {\n            let mut uri: Option<String> = None;\n            let mut namespace: Option<String> = None;\n            let parse_error: &'static str = \"Correct format is tcp:db_hostname:port.\";\n            if !s.is_empty() {\n                let mut parts = s.split(':');\n                while let Some(part) = parts.next() {\n                    match part {\n                        \"tcp\" => {\n                            let address = parts.next().ok_or_else(|| {\n                                anyhow!(\"Failed to find address for {s}. {parse_error}\")\n                            })?;\n                            let port_str = parts.next().ok_or_else(|| {\n                                anyhow!(\"Failed to find port for {s}. {parse_error}\")\n                            })?;\n                            let port = NonZeroU16::from_str(port_str).map_err(|_| {\n                                anyhow!(\n                                    \"Failed to find parse port {port_str} for {s}. {parse_error}\",\n                                )\n                            })?;\n                            if uri.is_some() {\n                                bail!(\"The uri has already been assigned\");\n                            }\n                            uri = Some(format!(\"{address}:{port}\"));\n                        }\n                        _ if part.starts_with(\"table\") => {\n                            if namespace.is_some() {\n                                bail!(\"The namespace has already been assigned\");\n                            }\n                            namespace = Some(part.to_string());\n                        }\n                        _ => {\n                            bail!(\"the entry \\\"{part}\\\" is not matching\");\n                        }\n                    }","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/linera-io/linera-protocol/blob/6c226ddcb332ef55118dc8d0aafbd093d5420899/linera-storage-runtime/src/storage_config.rs#L176-L212","documentation":"After reading hostname and port tokens from a scylladb tcp segment, from_str parses the port with NonZeroU16::from_str. This error means the port token exists but is not a valid nonzero u16 — zero, negative, non-numeric, out of range, or containing trailing characters.","triggerScenarios":"--storage 'scylladb:tcp:host:0', 'scylladb:tcp:host:9042x', 'scylladb:tcp:host:nine' or a port above 65535. Any of these fails the NonZeroU16 parse.","commonSituations":"Port 0 used as a placeholder; extra characters glued to the port by shell interpolation (e.g. $PORT with a trailing space or newline); IPv6-style colons confusing the ':'-split parser.","solutions":["Use a plain integer between 1 and 65535 for the port, e.g. 9042 (the ScyllaDB default)","Check for stray characters around an interpolated port variable: --storage \"scylladb:tcp:host:${PORT}\" with PORT='9042 ' fails","Do not use 0 — zero ports are rejected by design"],"exampleFix":"# before\n--storage scylladb:tcp:host:0\n# after\n--storage scylladb:tcp:host:9042","handlingStrategy":"validation","validationCode":"// Rust: pre-validate port tokens\nuse std::num::NonZeroU16;\n\nfn ports_are_valid(s: &str) -> bool {\n    let mut parts = s.split(':');\n    while let Some(part) = parts.next() {\n        if part == \"tcp\" {\n            let _addr = parts.next().unwrap_or(\"\");\n            let port = parts.next().unwrap_or(\"\");\n            if NonZeroU16::from_str(port).is_err() { return false; }\n        }\n    }\n    true\n}","typeGuard":"fn is_nonzero_u16(s: &str) -> bool { std::num::NonZeroU16::from_str(s).is_ok() }","tryCatchPattern":"let port = NonZeroU16::from_str(port_str)\n    .with_context(|| format!(\"port {port_str:?} in {s:?} must be 1..=65535\"))?;","preventionTips":["Trim and sanity-check interpolated port variables before building the config string","Reject port 0 in your own tooling — the parser intentionally disallows it","Keep the port numeric-only; no protocol suffixes or units"],"tags":["linera","storage","scylladb","config","parsing","port"],"backgroundTag":"invalid-port-number","analyzedSha":"6c226ddcb332ef55118dc8d0aafbd093d5420899","analyzedAt":"2026-08-22T22:49:09.787Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}