Skip to content
Docs / dflux EdgeGuard
ContactGet started

Hot reload and runtime ops

Most operational changes to the proxy take effect without restarting the daemon. This guide spells out exactly what's hot-reloadable, what isn't, and the runtime ops you can perform — drain a producer, change log level, validate a config — without a redeploy.

The mechanism

The proxy holds the request and response filter chains behind atomic pointers. When the control-plane-store watcher detects a change (default poll interval 5s), the proxy builds a fresh chain off the request path and atomically swaps it in. No per-request lock, no draining of in-flight requests, no dropped connections.

Hot-reloadable (no restart)

ChangeHow it lands
Policy rules — add / update / delete / rollbackadmin API mutation → store → next watcher tick → atomic swap
Rate-limit rulessame
Transformation rulessame
Routing rulessame
Producer pool — drain / restore / weightdirect admin endpoint; takes effect on next request
Producer configs (persistent)store → next watcher tick
Log leveld3x-edgectl log-level set; immediate, node-local
default_actiond3x-edgectl default-action set|flip; live, no restart
NRF profile definitionsstore → registrar reload; the leader re-registers with the NRF
Diameter peers / routes / settingsstore watcher reloads the live relay when the Diameter subset actually changes
Active policy version (rollback)snapshot restore; atomic swap to the captured document
Watch your fingertips
Every hot-reloadable mutation is applied the moment the watcher ticks, with no confirmation step. A "the rule disappeared" incident is almost always an earlier admin mutation — the proxy logs each applied change as a structured JSON line, so grep the decision log to see what changed and when.

Requires restart

ChangeWhy a restart
Listen addresses (SBI / admin / Diameter / metrics)Listeners bind at startup
TLS material on the listenersReloaded on certificate file change via the cert reloader; full TLS block swaps require restart
Diameter transport, origin host/realm, listen addressIdentity and bind of the Diameter node; peer and route rows in the store still hot-reload
Storage drivers / DSNsConnection pools open at startup
pprof, tracing endpoint, server timeoutsBound to long-lived components

Certificate reload

The certificate reloader watches the configured cert_file and key_file paths and reloads on change. The standard ops pattern:

  1. Drop the new cert + key alongside the old, or rename atomically.
  2. The reloader picks up the change on the next file-watch tick.
  3. New TLS handshakes use the new material; established connections keep their existing TLS state.

This applies to both SBI and admin listeners (and Diameter TCP TLS).

Runtime ops cheat sheet

Drain and restore a producer

Take a single SBI producer out of rotation without removing it from config — useful for targeted ops on a flapping instance.

Bash

Shift producer weight

Bash

Both take effect on the next request. No restart.

Change log level live

Bash

Validate before apply

Bash

validate config checks a bootstrap YAML/JSON file without starting the daemon. apply --dry-run resolves create / update / unchanged for PolicyRule, RateLimit, Transformation, RoutingRule, ProducerConfig, and ProfileConfig manifests without writing. There is no validate policy subcommand — rules validate inline on write.

Tune watcher cadence

The store-watcher polls at process.store_watch_interval (default 5s). Tighter means faster propagation in multi-instance deployments; looser means fewer DB round-trips. Restart required to change.

Multi-instance propagation

When two or more d3x-edge instances share a Postgres control-plane store, a hot-reloadable change applied to one instance propagates to the others within the watcher window. For coordinated rollouts (e.g. a policy change you want to land everywhere simultaneously), drop the watcher interval temporarily, apply, then restore.