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 != oldView on GitHub (pinned to 3a66a489d2)
Solutions
- Read the wrapped error to identify the exact leaf-node field that cannot change, then revert it or restart
- Restart the server to apply leaf-node topology or remote changes
- 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
- Restart instead of reloading when changing leafnodes.remotes, remote urls, or credentials
- Keep leaf-node block edits limited to reloadable fields
- Stage config changes and run reload in a canary server before fleet rollout
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
- config reload does not support moving to or from an account
- config reload not supported for %s: old=%v, new=%v
- config reload not supported for jetstream storage directory
- config reload not supported for jetstream dynamic max memory
- config reload not supported for decreasing jetstream max mem
AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02).
Data as JSON: /api/errors/dde4cd00cfb200cf.
Report an issue: GitHub.