hashicorp/nomad · error

unknown nomad server %s

Error message

unknown nomad server %s

What it means

forwardFor locates a target server by server ID among the local region's member list. If no server with the given ID exists in the LAN Serf membership, target stays nil and this error is returned. It means the requested server name doesn't match any known Nomad server.

Source

Thrown at nomad/client_agent_endpoint.go:413

		isLeader, remoteLeader := a.srv.getLeader()
		if !isLeader && remoteLeader != nil {
			target = remoteLeader
		} else if !isLeader && remoteLeader == nil {
			return nil, structs.ErrNoLeader
		} else if isLeader {
			// This server is current leader do not forward
			return nil, nil
		}
	} else {
		target, err = a.srv.getServer(region, serverID)
		if err != nil {
			return nil, err
		}
	}

	// Unable to find a server
	if target == nil {
		return nil, fmt.Errorf("unknown nomad server %s", serverID)
	}

	// ServerID is this current server,
	// No need to forward request
	if target.Name == a.srv.LocalMember().Name {
		return nil, nil
	}

	return target, nil
}

func (a *Agent) forwardMonitorClient(conn io.ReadWriteCloser, args any, encoder *codec.Encoder, decoder *codec.Decoder, nodeID string, endpoint string) {
	// Get the Connection to the client either by fowarding to another server
	// or creating direct stream
	state, srv, err := a.findClientConn(nodeID)
	if err != nil {
		handleStreamResultError(err, new(int64(500)), encoder)
		return

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. List valid targets with `nomad server members` (or Members() API) and use the exact serf Name of a live server.
  2. Retry after new servers join; a freshly started server may not yet be visible.
  3. If the server was replaced, target the new server's name instead of the old ID.

Example fix

// before
reply, err := endpoint.Profile(args) // args.ServerID = "old-server" (decommissioned)
// after
members, _ := client.Agent().Members()
args.ServerID = pickLiveServer(members) // e.g. "ip-10-0-0-5.node.dc1"
Defensive patterns

Strategy: validation

Validate before calling

members, err := client.Agent().Members()
if err != nil { return err }
valid := false
for _, m := range members.Members {
    if m.Name == serverID { valid = true; break }
}
if !valid { return fmt.Errorf("server %q not in member list", serverID) }

Try / catch

target, err := forwardFor(ctx, args, serverID)
if err != nil && strings.HasPrefix(err.Error(), "unknown nomad server") {
    // refresh member list and retry with a live server name
}

Prevention

When it happens

Trigger: Calling Profile, monitor, monitorExport, or Host with a ServerID/ServerName parameter that does not match any member returned by the local memberlist — the exact case in forwardFor when target == nil after scanning members.

Common situations: Typo in server name when selecting a node for profiling/logs; targeting a server that was decommissioned or replaced (names regenerate); querying a region whose member list doesn't include the target; DNS vs serf name confusion (serf name is not the hostname).

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/b4f069318ecbe684. Report an issue: GitHub.