Prevent error-state resources from starving reconciliation — configure ProviderConfig reconciliationPolicy (exponential backoff)
Last updated: July 21, 2026
Issue
At scale, managed resources stuck in a permanent error state keep retrying and consume the shared reconciliation budget
This starves healthy/new managed resources — they stop reconciling, so new create/update changes are not applied to the cloud
Common in large multi-tenant environments with many MRs (e.g. 100+ database instances), where error-state resources are owned by other teams and not fixed quickly
Increasing the reconcile rate / poll interval as a workaround causes cloud-provider API throttling
Environment
Crossplane / UXP with official (upjet-based) providers
reconciliationPolicyAPI available in provider families v2.6.0+ (AWS, GCP, Azure) and provider-azuread v2.3.0+Available on the v2 release branches of the official providers only
Resolution
Configure a ProviderConfig
reconciliationPolicy.exponentialFailureRateLimiterto back off error-state MRs more aggressively, freeing reconcile workers for healthy/new resourcesExample:
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: long-delay
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: aws-creds
key: creds
reconciliationPolicy:
exponentialFailureRateLimiter:
baseDelay: "1m"
maxDelay: "60m"Point the relevant managed resources at that ProviderConfig:
spec:
providerConfigRef:
name: long-delayConstraints:
baseDelayminimum 1s,maxDelayminimum 60sYou can define multiple ProviderConfigs (e.g. a dedicated long-delay policy) and reference them from specific MRs
Requires official providers on the v2 branch — upgrade to v2 to use this API
Verify: error-state MRs retry less frequently and healthy/new MRs reconcile without starvation (error-state count should drop as workers are freed)
Cause
Official providers use a binary exponential backoff for failing MRs, but the maximum delay was effectively capped/hardcoded, so error-state MRs kept retrying often
With a limited number of reconcile workers, many constantly-failing MRs consume the budget and block healthy/new MRs — a fairness/starvation problem
The new
reconciliationPolicyAPI makes the backoff configurable, so error-state MRs can be de-prioritized without raising the global reconcile rate (which would trigger cloud API throttling)