nats-io/nats-server · error
lookup for host %q: %v
Error message
lookup for host %q: %v
What it means
getRandomIP wraps a resolver.LookupHost failure while resolving a hostname used in a URL (route, gateway or leafnode remote): the DNS lookup for that host failed and the underlying resolver error is appended. The URL itself was already split into host:port; the fault is name resolution, not URL syntax.
Source
Thrown at server/server.go:4668
s.Errorf("%s Accept error: %v", acceptName, err)
}
return tmpDelay
}
var errNoIPAvail = errors.New("no IP available")
func (s *Server) getRandomIP(resolver netResolver, url string, excludedAddresses map[string]struct{}) (string, error) {
host, port, err := net.SplitHostPort(url)
if err != nil {
return "", err
}
// If already an IP, skip.
if net.ParseIP(host) != nil {
return url, nil
}
ips, err := resolver.LookupHost(context.Background(), host)
if err != nil {
return "", fmt.Errorf("lookup for host %q: %v", host, err)
}
if len(excludedAddresses) > 0 {
for i := 0; i < len(ips); i++ {
ip := ips[i]
addr := net.JoinHostPort(ip, port)
if _, excluded := excludedAddresses[addr]; excluded {
if len(ips) == 1 {
ips = nil
break
}
ips[i] = ips[len(ips)-1]
ips = ips[:len(ips)-1]
i--
}
}
if len(ips) == 0 {
return "", errNoIPAvail
}View on GitHub (pinned to 3a66a489d2)
Solutions
- Verify the hostname resolves (dig/nslookup) from the server host
- Fix DNS configuration (/etc/resolv.conf, DNS server) or add an /etc/hosts entry
- Use an IP address in the config to bypass DNS
- Retry after transient DNS outages; the server retries solicitation
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at server/server.go:4668 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02).
Data as JSON: /api/errors/e039639447edd4c9.
Report an issue: GitHub.