14.2 Dynamic configuration
dynamic Limits {
rps: u32 = DEFAULT_RPS
newSearch: Flag = Flag.off
}
let l = Limits.get()
if current > l.rps.get() { throttle() }
for await v in l.rps.changes() { limiter.set(v) }
if l.newSearch.on(for: ctx.caller) { newSearch(q) } else { oldSearch(q) }dynamic Name { … }— values are stored in the coordinator, replicated to all nodes and changed without restart.Limits.get()returns a live handle:.get()is the current value,.changes()astream<T>.- Override hierarchy: global → role → zone → node → the principal's
tenant. The narrowest wins. - Every change is type-checked (including refinements), versioned and can be rolled back.
Flagis a flag with rules: percentage, splittingby: .User | .Node | .Tenant, allow lists.on(for: p)is deterministic for one principal.- A change:
oxl config set, the web interface orLimits.set(…)in code; all paths are checked by the policypolicy Limits { allow set if … }.
Implementation-defined. Dynamic configuration (D-8056; DIV-033; D-5203). This implementation keeps a history of the last 40 changes per field; there is no dynamic-configuration page in the web interface
oxl inspect(the commandsoxl config get|set|history|rollbackexist);oxl configwithout--clusteris not supported.
See also
Source: docs/spec/oxl-standard.en.md