Context
The CF provider does not implement poll jitter. Without jitter, resources created at similar times requeue simultaneously, causing "thundering herd" spikes — especially after provider restarts when all resources are re-enqueued at once. At scale (500+ resources), this can briefly saturate both the internal rate limiter and the CF CAPI per-user rate limit.
Scope
- Add
WithPollJitterHook to the controller options in cmd/provider/main.go
- Expose
--poll-jitter-percentage CLI flag (following provider-kubernetes pattern, default 10%)
- Apply jitter to all controllers (all CF controllers are pure native, so no hybrid/upjet complications)
- Document how to configure in the README.md example in the BTP
- Test the jitter configuration
Out of scope
Hint: Smaller feature wishes tend to be implemented and shipped quicker!
- Adaptive poll intervals (longer-term, requires
WithPollIntervalHook)
- Per-controller jitter settings
Technical Steps
- Add
--poll-jitter-percentage flag to cmd/provider/main.go (default 10, same as provider-kubernetes)
- Compute jitter:
jitter := time.Duration(float64(*pollInterval) * float64(*pollJitterPercentage) / 100.0)
- Apply via
managed.WithPollJitterHook(jitter) in controller options
- Reference implementation: provider-kubernetes
main.go exposes --poll-jitter-percentage; provider-gcp hardcodes 5%
Workarounds & Alternatives
- Manually stagger resource creation times (impractical at scale)
Additional context
Context
The CF provider does not implement poll jitter. Without jitter, resources created at similar times requeue simultaneously, causing "thundering herd" spikes — especially after provider restarts when all resources are re-enqueued at once. At scale (500+ resources), this can briefly saturate both the internal rate limiter and the CF CAPI per-user rate limit.
Scope
WithPollJitterHookto the controller options incmd/provider/main.go--poll-jitter-percentageCLI flag (following provider-kubernetes pattern, default 10%)Out of scope
Hint: Smaller feature wishes tend to be implemented and shipped quicker!
WithPollIntervalHook)Technical Steps
--poll-jitter-percentageflag tocmd/provider/main.go(default 10, same as provider-kubernetes)jitter := time.Duration(float64(*pollInterval) * float64(*pollJitterPercentage) / 100.0)managed.WithPollJitterHook(jitter)in controller optionsmain.goexposes--poll-jitter-percentage; provider-gcp hardcodes 5%Workarounds & Alternatives
Additional context
WithPollJitterHookincrossplane-runtime/pkg/reconciler/managed/reconciler.go