{"record":{"id":"e229b4a0e5856a13","repo":"quickwit-oss/quickwit","slug":"failed-to-parse-address-hostname-is-invalid","errorCode":null,"errorMessage":"failed to parse address `{}`: hostname is invalid","messagePattern":"failed to parse address `(.+?)`: hostname is invalid","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"quickwit/quickwit-common/src/net.rs","lineNumber":169,"sourceCode":"                port: socket_addr.port(),\n            });\n        }\n        if let Ok(ip_addr) = host_addr.parse::<IpAddr>() {\n            return Ok(Self {\n                host: Host::IpAddr(ip_addr),\n                port: default_port,\n            });\n        }\n        let (hostname, port) = if let Some((hostname_str, port_str)) = host_addr.split_once(':') {\n            let port_u16 = port_str.parse::<u16>().with_context(|| {\n                format!(\"failed to parse address `{host_addr}`: port is invalid\")\n            })?;\n            (hostname_str, port_u16)\n        } else {\n            (host_addr, default_port)\n        };\n        if !is_valid_hostname(hostname) {\n            bail!(\n                \"failed to parse address `{}`: hostname is invalid\",\n                host_addr\n            )\n        }\n        Ok(Self {\n            host: Host::Hostname(hostname.to_string()),\n            port,\n        })\n    }\n\n    /// Resolves the host if necessary and returns a `SocketAddr`.\n    pub async fn resolve(&self) -> anyhow::Result<SocketAddr> {\n        self.host\n            .resolve()\n            .await\n            .map(|ip_addr| SocketAddr::new(ip_addr, self.port))\n    }\n","sourceCodeStart":151,"sourceCodeEnd":187,"githubUrl":"https://github.com/quickwit-oss/quickwit/blob/a39730c5cdcd1a4fe798403737ae293999ea21f8/quickwit/quickwit-common/src/net.rs#L151-L187","documentation":"`HostAddr::parse_with_default_port` parses `<host>:<port>` strings (with an optional default port when the port is omitted). After extracting the hostname and port, it re-validates the hostname with `is_valid_hostname`; if the hostname part fails validation it rejects the whole address with this error, even though the string may have split cleanly.","triggerScenarios":"Parsing an address string whose host portion is not a valid DNS hostname — e.g. `\"my_node:7200\"` (underscore in host), `\"-node:7200\"`, an over-long label, or an empty host like `\":7200\"` — via `HostAddr::from_str` or config fields expecting `host:port`.","commonSituations":"Malformed `peer_address`/`advertise_address`/gRPC listen addresses in quickwit.yaml, hostnames containing underscores generated by container orchestrators, IPv6 addresses without brackets (`::1:7200` parses the wrong part as hostname), or pasting addresses with hidden whitespace.","solutions":["Correct the hostname portion to valid DNS syntax (alphanumerics and hyphens only) and re-parse.","For IPv6 hosts, wrap the address in brackets: `[::1]:7200` instead of `::1:7200`.","If an IP was intended, verify the IP syntax — a malformed IP falls through to hostname validation and fails there.","Ensure the value is `host` or `host:port` with no extra separators, spaces, or scheme prefix (`http://` must be stripped)."],"exampleFix":"// before\nlet addr: HostAddr = \"node_1:7200\".parse()?; // invalid hostname\n// after\nlet addr: HostAddr = \"node-1:7200\".parse()?;","handlingStrategy":"validation","validationCode":"fn parse_addr_checked(s: &str, default_port: u16) -> Result<quickwit_common::net::HostAddr, String> {\n    let s = s.trim();\n    let host_part = s.rsplit_once(':').map(|(h, _)| h).unwrap_or(s);\n    if host_part.contains('_') {\n        return Err(format!(\"hostname '{host_part}' contains invalid characters (use hyphens)\"));\n    }\n    s.parse::<quickwit_common::net::HostAddr>().map_err(|e| e.to_string())\n}","typeGuard":null,"tryCatchPattern":"match addr_str.parse::<quickwit_common::net::HostAddr>() {\n    Ok(addr) => use_addr(addr),\n    Err(e) if e.to_string().contains(\"hostname is invalid\") => {\n        // hint user: check host portion syntax, bracket IPv6\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Always format IPv6 as `[host]:port`.","Strip scheme prefixes (`http://`) before parsing host:port values.","Keep container/orchestrator node names DNS-safe (hyphens, not underscores).","Validate all host:port config fields at startup with clear error messages."],"tags":["network","parsing","validation","address"],"backgroundTag":"invalid-argument-format","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"}