Configuration propagation
A configuration change saved in the Console or through the admin API reaches the data plane in under a minute. Nothing is redeployed and no request is dropped: the data plane controller collects pending configuration changes every ten seconds and applies them to the running gateway. Two slower periodic syncs sit behind that as a backstop, so thirty minutes is the outer bound before a change that has not taken effect is worth investigating.
How long a change takes
| Path | When it runs | How long |
|---|---|---|
| Normal | Every save. The management plane records the change and the data plane controller collects it on its next pass. | A few seconds; under a minute |
| Backstop | Periodic reconciliation, whether or not anything changed. Catches a change that did not reach this data plane on the normal path. | 5 minutes for the drift sweep, 30 minutes for the full sync |
The backstop is not the expected path. It exists so that a data plane which was restarting, unreachable, or newly joined converges on its own without an operator re-saving anything.
This applies to every change held in the management plane: providers and their credentials, the model catalog, model assignments to a project, routing policies, fallback chains, traffic-splitting weights, budgets, rate limits, guardrails, API keys and their tags, MCP profiles, and request-log settings. It does not apply to a change to the data plane release itself. Changing the gateway image or its replica count is a Helm deployment, not a configuration change, and follows the data plane upgrade path instead.
What happens when a change is saved
- The change is written through the Console, the admin API, or an infrastructure-as-code apply, and the management plane stores it.
- The management plane records a configuration change for every data plane and every project gateway the change affects.
- The controller in the data plane collects pending changes on its next pass, by default every ten seconds, and writes the resulting gateway configuration.
- The gateway begins serving the new configuration. In-flight requests are not dropped and no pod restarts.
The propagation settings
Three settings on the data plane controller govern the timings above. The defaults are what a standard installation runs; there is no reason to change them outside of a support engagement.
| Helm value / environment variable | Default | What it controls |
|---|---|---|
workerConfig.pollInterval | 10s | How often the controller collects pending configuration changes. This is the normal path. |
WORKER_DRIFT_SWEEP_INTERVAL | 5m | How often the controller asks the management plane to re-send anything this data plane has not converged on. |
WORKER_FULL_SYNC_EVERY_N_DRIFT_TICKS | 6 | How many drift sweeps pass between full syncs. At the defaults this is one full sync every 30 minutes. A full sync also runs when the controller starts. |
Lowering the poll interval does not make a change arrive materially sooner and adds load on the management plane. Raising the sweep intervals widens the window in which an unnoticed gap goes uncorrected.
What the gateway returns while a change is in flight
A model whose configuration is still landing returns one of three errors rather than serving traffic. All three use the standard error format.
| Code | Status | Meaning | What to do |
|---|---|---|---|
model_not_ready | 503 | The route for this model exists but is not active yet. The response carries Retry-After: 30. | Retry. Most SDKs retry a 503 with Retry-After automatically. |
model_not_found | 400 | The data plane does not have this model in its catalog yet. | If the model was enabled in the last minute, retry. Otherwise check the spelling against GET /v1/models. |
model_not_routed | 404 | No route is deployed for this model on this data plane. | If the model was enabled in the last minute, retry. Otherwise check that it is assigned to the project this key belongs to. |
Two things about this window are worth knowing before it is mistaken for a misconfiguration:
- The gateway's model list is delivered configuration, not the catalog.
GET /v1/modelson the gateway returns what that data plane has been given, so a model enabled a moment ago is absent from it until the change lands, and a request for it returnsmodel_not_found. The Console shows the model immediately, because the Console reads the catalog. The two disagreeing is the normal appearance of a change in flight, not a fault. - Routes can exist before the backends they point at. On a self-hosted data plane,
kubectl get aigatewayroutes -Acan briefly show rows that are notAccepted, with a message naming a backend that does not exist yet. A provider's routes and its backends are written as separate steps, and a snapshot taken between them looks like a permanent failure. Re-check before acting on it.
When a change has not taken effect
Work through this in order. Steps 1 and 2 cover almost every case.
- Wait a full minute and retry. A retry inside the first few seconds is the most common reason a change looks like it did not apply.
- Confirm the change is actually saved. Reload the page in the Console rather than trusting the form state. The Console shows a saved value immediately, whether or not the data plane has it yet.
- Check the error code.
model_not_readymeans the change is still landing and the only correct action is to retry.model_not_routedafter a minute means the model has no route on this data plane, which is a configuration question rather than a timing one: confirm the model is enabled in the catalog and assigned to the project. - On a self-hosted data plane, confirm the routes are accepted.
kubectl get aigatewayroutes -Ashould showAcceptedfor the affected rows. Rows that stay unaccepted for more than a few minutes, naming a backend that does not exist, indicate the data plane has part of the change and not the rest. - Give it thirty minutes before opening a case. That is one full sync cycle. A change that has not taken effect after a full sync is not a propagation delay, and the support case should say so, with the time of the save and the time of the last request that used the old configuration.
Nothing in the Console indicates that a rollout is in progress. A saved value is displayed as soon as it is stored, so the Console cannot be used to tell "applied" from "saving". Confirm a change by sending a request through the gateway, not by reading it back in the Console.
Related
- Gateway behavior: the error format, error codes, and correlation IDs
- Manage configuration as code: applying configuration from a version-controlled repository
- Routing policy reference: what a routing policy is and where it is targeted