hashicorp/nomad · error
Server at address %s failed ping: %v
Error message
Server at address %s failed ping: %v
What it means
While refreshing its server list, the client pings each candidate server address to verify it is a real, reachable server. If c.Ping(addr) fails for a candidate, the address is recorded as a multi-error entry with this message. Depending on the force flag, the candidate may be discarded or still injected.
Source
Thrown at client/client.go:1313
endpoints := make([]*servers.Server, 0, len(in))
wg.Add(len(in))
for _, s := range in {
go func(srv string) {
defer wg.Done()
addr, err := resolveServer(srv)
if err != nil {
mu.Lock()
c.logger.Debug("ignoring server due to resolution error", "error", err, "server", srv)
merr.Errors = append(merr.Errors, err)
mu.Unlock()
return
}
// Try to ping to check if it is a real server
if err := c.Ping(addr); err != nil {
mu.Lock()
merr.Errors = append(merr.Errors, fmt.Errorf("Server at address %s failed ping: %v", addr, err))
mu.Unlock()
// If we are forcing the setting of the servers, inject it to
// the serverlist even if we can't ping immediately.
if !force {
return
}
}
mu.Lock()
endpoints = append(endpoints, &servers.Server{Addr: addr})
mu.Unlock()
}(s)
}
wg.Wait()
// Only return errors if no servers are validView on GitHub (pinned to 482b49bf1a)
Solutions
- Check the wrapped %v ping error to distinguish connection-refused/timeout from TLS errors and fix the underlying cause.
- Verify the Nomad servers' RPC port (default 4647) is reachable from the client: nc -zv <server> 4647.
- Confirm DNS/addresses in the servers list resolve to live Nomad server nodes; remove stale entries.
- If TLS is enabled, ensure the client's CA cert and server certs are valid and match on both sides.
Example fix
// before (client.hcl with unreachable server)
client { servers = ["10.0.0.5:4647"] } // server decommissioned
// after
client { servers = ["10.0.0.10:4647", "10.0.0.11:4647"] } # live servers
# plus: open firewall
# sudo ufw allow 4647/tcp Defensive patterns
Strategy: retry
Validate before calling
for _, addr := range servers {
conn, err := net.DialTimeout("tcp", addr, 2*time.Second)
if err != nil {
log.Printf("server %s unreachable before join: %v", addr, err)
} else {
conn.Close()
}
} Try / catch
if err := client.Ping(addr); err != nil {
merr.Errors = append(merr.Errors, err)
// retry with backoff, then try next server in the list
if !retryable(err) { return merr }
time.Sleep(backoff)
continue
} Prevention
- Configure multiple servers in the client's servers list for redundancy
- Open RPC port 4647 in firewalls/security groups between clients and servers
- Keep server DNS records current; remove decommissioned server addresses
- Keep TLS CA/cert configuration consistent across the cluster
- Monitor server health so dead servers are replaced before clients notice
When it happens
Trigger: Client heartbeat/server-list update loop: c.Ping(addr) returns an error (connection refused, timeout, TLS mismatch) for a server address in the returned server list.
Common situations: Server down or restarted, firewall/security group blocking the RPC port (4647), stale DNS entries pointing at decommissioned servers, network partition, or clients and servers with mismatched TLS/CA configuration.
Related errors
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/e7ac5f71b6cc66d1.
Report an issue: GitHub.