hashicorp/nomad · error
unknown Nomad server %s
Error message
unknown Nomad server %s
What it means
getServer resolves a server ID to a known peer from the local LAN serf membership. This error means the given serverID matches neither the Name nor ID of any server the node currently knows about — the target server is unknown, has left, or membership data is stale.
Source
Thrown at nomad/rpc.go:741
return r.srv.connPool.RPC(region, server.Addr, method, args, reply)
}
func (r *rpcHandler) getServer(region, serverID string) (*peers.Parts, error) {
servers := r.srv.peersCache.RegionPeers(region)
if len(servers) == 0 {
r.logger.Warn("no path found to region", "region", region)
return nil, structs.ErrNoRegionPath
}
// Lookup server by id or name
for _, server := range servers {
if server.Name == serverID || server.ID == serverID {
return server, nil
}
}
return nil, fmt.Errorf("unknown Nomad server %s", serverID)
}
// streamingRpc creates a connection to the given server and conducts the
// initial handshake, returning the connection or an error. It is the callers
// responsibility to close the connection if there is no returned error.
func (r *rpcHandler) streamingRpc(server *peers.Parts, method string) (net.Conn, error) {
c, err := r.srv.connPool.StreamingRPC(r.srv.config.Region, server.Addr)
if err != nil {
return nil, err
}
return r.streamingRpcImpl(c, method)
}
// streamingRpcImpl takes a pre-established connection to a server and conducts
// the handshake to establish a streaming RPC for the given method. If an error
// is returned, the underlying connection has been closed. Otherwise it is
// assumed that the connection has been hijacked by the RPC method.View on GitHub (pinned to 482b49bf1a)
Solutions
- Verify all servers are healthy members with `nomad server members`
- Remove stale/dead members (`nomad server members -prune` or restart gossip healing) and retry
- Ensure server data dirs are not reused in a way that changes node IDs unexpectedly
- Check network connectivity (serf ports) between servers so membership converges
Example fix
// before # retrying RPC to stale server id 8f3a... (old server) // after nomad server members # pick a live server nomad server members -prune # drop dead members, retry
Defensive patterns
Strategy: retry
Validate before calling
members, _ := client.Agent().Members()
live := false
for _, m := range members.Members {
if m.Name == serverID || m.ID == serverID { live = true }
}
if !live { return fmt.Errorf("server %s not in LAN membership", serverID) } Try / catch
srv, err := getServer(servers, serverID)
if err != nil && strings.Contains(err.Error(), "unknown Nomad server") {
// refresh membership (serf) and retry once
time.Sleep(time.Second)
srv, err = getServer(refreshServers(), serverID)
} Prevention
- Monitor serf LAN membership health
- Prune dead members after server decommissions
- Avoid caching server IDs across restarts; resolve via membership each time
When it happens
Trigger: Internal RPC paths (e.g. specific-node forwarding, streaming RPC setup) resolving a serverID that is not in serf's LAN member list; peer left/restarted and ID changed; gossip lag after restarts.
Common situations: Server restarted and generated a new node ID while clients cached the old one; split gossip/partitioned LAN; firewall/serf port issues leaving stale member lists; scripts referencing removed servers.
Related errors
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/df427ed3582a8f82.
Report an issue: GitHub.