{"record":{"id":"8c15eae98275e450","repo":"sgl-project/sglang","slug":"cannot-resolve-host-host-r-e","errorCode":null,"errorMessage":"Cannot resolve host {host!r}: {e}","messagePattern":"Cannot resolve host (.+?): (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/srt/utils/network.py","lineNumber":494,"sourceCode":"\n    def to_host_port_str(self) -> str:\n        \"\"\"``host:port`` string for gRPC listen address, session IDs, logs.\"\"\"\n        return f\"{_wrap(self.host)}:{self.port}\"\n\n    @staticmethod\n    def resolve_host(host: str) -> str:\n        \"\"\"Return *host* as-is if it's an IP, otherwise DNS-resolve to one.\"\"\"\n        try:\n            ipaddress.ip_address(host)\n            return host\n        except ValueError:\n            pass\n        try:\n            return socket.getaddrinfo(\n                host, None, socket.AF_UNSPEC, 0, 0, socket.AI_ADDRCONFIG\n            )[0][4][0]\n        except socket.gaierror as e:\n            raise ValueError(f\"Cannot resolve host {host!r}: {e}\") from e\n\n    def resolved(self) -> NetworkAddress:\n        \"\"\"DNS-resolve hostname to IP; return self if already an IP.\"\"\"\n        ip = self.resolve_host(self.host)\n        return self if ip == self.host else NetworkAddress(ip, self.port)\n\n    def to_bind_tuple(self) -> Tuple[str, int]:\n        \"\"\"Raw ``(host, port)`` tuple for ``socket.bind()`` / ``socket.connect()``.\n\n        Returns the *unwrapped* host — sockets need the raw address, not\n        the bracketed form.\n        \"\"\"\n        return (self.host, self.port)\n\n    @staticmethod\n    def parse(addr: str) -> NetworkAddress:\n        \"\"\"Parse a ``host:port`` string into a ``NetworkAddress``.\n","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/srt/utils/network.py#L476-L512","documentation":"NetworkAddress.resolve_host DNS-resolves the host via getaddrinfo with AI_ADDRCONFIG; a gaierror (name or service not known, temporary DNS failure) is wrapped in ValueError naming the host. Used before NCCL remote-group setup and by resolved().","triggerScenarios":"Passing a hostname that doesn't exist (typo in --nnodes host list, stale /etc/hosts entry) or a DNS outage when resolve_host()/resolved() is called.","commonSituations":"Multi-node launches with misspelled node names; Kubernetes headless service names not yet resolvable; VPN/DNS interruption during engine startup.","solutions":["Fix the hostname or add it to /etc/hosts/DNS.","Verify with `getent hosts <name>` or `python -c \"import socket; print(socket.getaddrinfo('<name>', None))\"`.","For multi-node, wait until all node DNS entries/services are up before launching."],"exampleFix":"# before\naddr = NetworkAddress.parse(\"node-01x:8000\")  # typo\n\n# after\naddr = NetworkAddress.parse(\"node-001:8000\")","handlingStrategy":"validation","validationCode":"import socket\ntry:\n    socket.getaddrinfo(host, None)\nexcept socket.gaierror:\n    raise SystemExit(f\"host {host} not resolvable; fix DNS//etc/hosts\")","typeGuard":null,"tryCatchPattern":"try:\n    ip = NetworkAddress(host, port).resolved()\nexcept ValueError as e:\n    # retry once after short delay for transient DNS, then fail\n    ...","preventionTips":["Resolve all node hostnames during preflight before launching multi-node jobs.","Use IPs or maintain accurate /etc/hosts in static clusters."],"tags":["network","dns","distributed"],"backgroundTag":"dns-resolution-failed","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}