From 78dcebeea0f6b8b530da3b7bcf013efdc7e89d47 Mon Sep 17 00:00:00 2001 From: Paulo Gomes Date: Tue, 9 Aug 2022 17:49:57 +0100 Subject: [PATCH] Add flags to configure exponential back-off retry Add two new flags to enable users to configure exponential back-off for Flux objects. The default values are now set to 750ms for minimum retry time, and 15min for max. Signed-off-by: Paulo Gomes --- controllers/alert_controller.go | 7 ++++++- controllers/provider_controller.go | 7 ++++++- controllers/receiver_controller.go | 7 ++++++- main.go | 5 +++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/controllers/alert_controller.go b/controllers/alert_controller.go index f753cb79e..57c111e31 100644 --- a/controllers/alert_controller.go +++ b/controllers/alert_controller.go @@ -31,6 +31,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/ratelimiter" "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" @@ -59,6 +60,7 @@ type AlertReconciler struct { type AlertReconcilerOptions struct { MaxConcurrentReconciles int + RateLimiter ratelimiter.RateLimiter } func (r *AlertReconciler) SetupWithManager(mgr ctrl.Manager) error { @@ -84,7 +86,10 @@ func (r *AlertReconciler) SetupWithManagerAndOptions(mgr ctrl.Manager, opts Aler handler.EnqueueRequestsFromMapFunc(r.requestsForProviderChange), builder.WithPredicates(predicate.GenerationChangedPredicate{}), ). - WithOptions(controller.Options{MaxConcurrentReconciles: opts.MaxConcurrentReconciles}). + WithOptions(controller.Options{ + MaxConcurrentReconciles: opts.MaxConcurrentReconciles, + RateLimiter: opts.RateLimiter, + }). Complete(r) } diff --git a/controllers/provider_controller.go b/controllers/provider_controller.go index 3f8e467d1..219c54b63 100644 --- a/controllers/provider_controller.go +++ b/controllers/provider_controller.go @@ -31,6 +31,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/predicate" + "sigs.k8s.io/controller-runtime/pkg/ratelimiter" "sigs.k8s.io/yaml" "github.com/fluxcd/pkg/apis/meta" @@ -53,6 +54,7 @@ type ProviderReconciler struct { type ProviderReconcilerOptions struct { MaxConcurrentReconciles int + RateLimiter ratelimiter.RateLimiter } func (r *ProviderReconciler) SetupWithManager(mgr ctrl.Manager) error { @@ -63,7 +65,10 @@ func (r *ProviderReconciler) SetupWithManagerAndOptions(mgr ctrl.Manager, opts P return ctrl.NewControllerManagedBy(mgr). For(&v1beta1.Provider{}). WithEventFilter(predicate.Or(predicate.GenerationChangedPredicate{}, predicates.ReconcileRequestedPredicate{})). - WithOptions(controller.Options{MaxConcurrentReconciles: opts.MaxConcurrentReconciles}). + WithOptions(controller.Options{ + MaxConcurrentReconciles: opts.MaxConcurrentReconciles, + RateLimiter: opts.RateLimiter, + }). Complete(r) } diff --git a/controllers/receiver_controller.go b/controllers/receiver_controller.go index 4346a4987..94910b96b 100644 --- a/controllers/receiver_controller.go +++ b/controllers/receiver_controller.go @@ -30,6 +30,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/ratelimiter" "github.com/fluxcd/pkg/apis/meta" "github.com/fluxcd/pkg/runtime/conditions" @@ -48,6 +49,7 @@ type ReceiverReconciler struct { type ReceiverReconcilerOptions struct { MaxConcurrentReconciles int + RateLimiter ratelimiter.RateLimiter } // +kubebuilder:rbac:groups=notification.toolkit.fluxcd.io,resources=receivers,verbs=get;list;watch;create;update;patch;delete @@ -136,7 +138,10 @@ func (r *ReceiverReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *ReceiverReconciler) SetupWithManagerAndOptions(mgr ctrl.Manager, opts ReceiverReconcilerOptions) error { return ctrl.NewControllerManagedBy(mgr). For(&v1beta1.Receiver{}). - WithOptions(controller.Options{MaxConcurrentReconciles: opts.MaxConcurrentReconciles}). + WithOptions(controller.Options{ + MaxConcurrentReconciles: opts.MaxConcurrentReconciles, + RateLimiter: opts.RateLimiter, + }). Complete(r) } diff --git a/main.go b/main.go index e750ed867..666309416 100644 --- a/main.go +++ b/main.go @@ -71,6 +71,7 @@ func main() { logOptions logger.Options leaderElectionOptions leaderelection.Options aclOptions acl.Options + rateLimiterOptions helper.RateLimiterOptions ) flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.") @@ -85,6 +86,7 @@ func main() { logOptions.BindFlags(flag.CommandLine) leaderElectionOptions.BindFlags(flag.CommandLine) aclOptions.BindFlags(flag.CommandLine) + rateLimiterOptions.BindFlags(flag.CommandLine) flag.Parse() log := logger.NewLogger(logOptions) @@ -126,6 +128,7 @@ func main() { Metrics: metricsH, }).SetupWithManagerAndOptions(mgr, controllers.ProviderReconcilerOptions{ MaxConcurrentReconciles: concurrent, + RateLimiter: helper.GetRateLimiter(rateLimiterOptions), }); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Provider") os.Exit(1) @@ -136,6 +139,7 @@ func main() { Metrics: metricsH, }).SetupWithManagerAndOptions(mgr, controllers.AlertReconcilerOptions{ MaxConcurrentReconciles: concurrent, + RateLimiter: helper.GetRateLimiter(rateLimiterOptions), }); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Alert") os.Exit(1) @@ -146,6 +150,7 @@ func main() { Metrics: metricsH, }).SetupWithManagerAndOptions(mgr, controllers.ReceiverReconcilerOptions{ MaxConcurrentReconciles: concurrent, + RateLimiter: helper.GetRateLimiter(rateLimiterOptions), }); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Receiver") os.Exit(1)