nats-io/nats-server · error

config reload not supported for %s: %v

Error message

config reload not supported for %s: %v

What it means

The `leafnodes` block supports some runtime changes, but getLeafNodeOptionsChanges validates which leaf-node fields changed. If an unsupported field changed, it returns an error naming the field and its old/new values, and ProcessReload wraps it as "config reload not supported for leafnode: <field> old=... new=...". The reload is rejected.

Source

Thrown at server/reload.go:1793

			// would lose the real TLS configuration.
			tmpOld.Gateways = copyRemoteGWConfigsWithoutTLSConfig(tmpOld.Gateways)
			tmpNew.Gateways = copyRemoteGWConfigsWithoutTLSConfig(tmpNew.Gateways)

			// If there is really a change prevents reload.
			if !reflect.DeepEqual(tmpOld, tmpNew) {
				// See TODO(ik) note below about printing old/new values.
				return nil, fmt.Errorf("config reload not supported for %s: old=%v, new=%v",
					field.Name, oldValue, newValue)
			}
		case "leafnode":
			tmpOld := oldValue.(LeafNodeOpts)
			tmpNew := newValue.(LeafNodeOpts)

			lno, err := getLeafNodeOptionsChanges(s, &tmpOld, &tmpNew)
			// If there was an unsupported change, we will get an error with the name
			// of the (first) field and its old and new value.
			if err != nil {
				return nil, fmt.Errorf("config reload not supported for %s: %v", field.Name, err)
			}
			// If there was an actual change...
			if lno != nil {
				diffOpts = append(diffOpts, lno)
			}
		case "jetstream":
			new := newValue.(bool)
			old := oldValue.(bool)
			if new != old {
				diffOpts = append(diffOpts, &jetStreamOption{newValue: new})
			}

			// Mark whether JS will be disabled.
			disableJS = !new
		case "storedir":
			new := newValue.(string)
			old := oldValue.(string)
			modified := new != old

View on GitHub (pinned to 3a66a489d2)

Solutions

  1. Read the wrapped error to identify the exact leaf-node field that cannot change, then revert it or restart
  2. Restart the server to apply leaf-node topology or remote changes
  3. Keep leaf-node changes limited to reloadable fields (e.g. some TLS settings) if reload is required

Example fix

// before
server # kill -HUP <pid>  (after editing leafnodes.remotes url)
// after
server # systemctl restart nats-server  (leaf remote changes require restart)
Defensive patterns

Strategy: validation

Validate before calling

// Parse the wrapped error to find the offending leaf field:
if err := s.Reload(); err != nil {
	var unsupported = strings.HasPrefix(err.Error(), "config reload not supported for leafnode:")
	if unsupported { restartServer(err) }
}

Prevention

When it happens

Trigger: Signaling reload after changing a leaf-node option that is not in the reloadable allow-list — e.g. adding/removing `leafnodes.remotes`, changing a remote's `url`, `creds`, `credentials`, or `hub` settings.

Common situations: Adding a new leaf remote connection via config edit + SIGHUP; rotating leaf-node credentials other than supported fields; tools templating leafnodes blocks and producing diffs the reload checker rejects.

Related errors


AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02). Data as JSON: /api/errors/dde4cd00cfb200cf. Report an issue: GitHub.