hashicorp/nomad · error

error parsing reserved_ports for network %q: %w

Error message

error parsing reserved_ports for network %q: %w

What it means

SetNode failed while parsing per-network reserved ports (a.ReservedPorts) on one of the node's reserved network interfaces. ParsePortRanges returned an error and SetNode wraps it with the network alias to identify which network's port list is invalid. Like the node-level variant, this is expected to be prevented by upstream validation and is fatal for node admission into the scheduler index.

Source

Thrown at nomad/structs/network.go:284

			// Mark reserved ports as used without worrying about
			// collisions. This effectively merges
			// client.reserved.reserved_ports into each
			// host_network.
			used := idx.getUsedPortsFor(a.Address)
			for _, p := range globalResPorts {
				used.Set(p)
			}

			// If ReservedPorts is set on the NodeNetwork, use it
			// and the global reserved ports.
			if a.ReservedPorts != "" {
				rp, err := ParsePortRanges(a.ReservedPorts)
				if err != nil {
					// This is a fatal error that should
					// have been prevented by validation
					// upstream.
					return fmt.Errorf("error parsing reserved_ports for network %q: %w", a.Alias, err)
				}
				for _, p := range rp {
					used.Set(uint(p))
				}
			}
		}
	}

	// Set dynamic port range (applies to all addresses)
	if node.NodeResources != nil && node.NodeResources.MinDynamicPort > 0 {
		idx.MinDynamicPort = node.NodeResources.MinDynamicPort
	}

	if node.NodeResources != nil && node.NodeResources.MaxDynamicPort > 0 {
		idx.MaxDynamicPort = node.NodeResources.MaxDynamicPort
	}

	return nil

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Correct the reserved_ports value on the network stanza named by the alias in the error so it is a valid port/range list
  2. Run local validation (same rules as ParsePortRanges) on each network's reserved_ports before publishing node updates
  3. Deregister/re-register the node if invalid values are already persisted in server state
  4. Check which network alias failed — fix only that stanza — since the error names it explicitly

Example fix

// before
network { alias = "public" reserved_ports = "22, 80800" }
// after
network { alias = "public" reserved_ports = "22, 8080-8090" }
Defensive patterns

Strategy: validation

Validate before calling

for _, nw := range node.ReservedResources.Networks.Networks {
	if !validPortList(nw.ReservedPorts) {
		return fmt.Errorf("network %q has invalid reserved_ports %q", nw.Alias, nw.ReservedPorts)
	}
}

Prevention

When it happens

Trigger: A node's reserved_resources.networks entry has a network (identified by alias) whose reserved_ports value is malformed — non-numeric entries, out-of-65535-range ports, or reversed ranges — encountered when SetNode builds used-port bitmaps during AllocsFit or node updates.

Common situations: Bad reserved_ports under a specific network stanza in client config (e.g. bridge or host network alias), typo introduced by automation, or stale/invalid node state from an older client version.

Related errors


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