@@ -18,8 +18,10 @@ package controllers
1818
1919import (
2020 "context"
21+ "crypto/rand"
2122 "errors"
2223 "fmt"
24+ "math/big"
2325 "sync"
2426 "syscall"
2527 "time"
@@ -423,8 +425,47 @@ func (r *ClusterSummaryReconciler) proceedDeployingClusterSummary(ctx context.Co
423425 logger .V (logs .LogInfo ).Error (err , "failed to deploy because of conflict" )
424426 return reconcile.Result {Requeue : true , RequeueAfter : r .ConflictRetryTime }, nil
425427 }
428+
429+ requeueAfter := normalRequeueAfter
430+ maxFailures := r .getMaxConsecutiveFailures (clusterSummaryScope )
431+
432+ if maxFailures > 1 {
433+ const (
434+ minMultiplier = 2
435+ maxMultiplier = 6
436+ )
437+
438+ // 1. Determine the ceiling safely.
439+ // By checking if maxFailures (uint) is less than maxMultiplier (6),
440+ // we ensure the value is small enough to cast to int64 without overflow.
441+ currentMax := int64 (maxMultiplier )
442+ if uint64 (maxFailures ) < uint64 (maxMultiplier ) {
443+ currentMax = int64 (maxFailures )
444+ }
445+
446+ // 2. Calculate the range (delta) for the random generator
447+ delta := currentMax - minMultiplier + 1
448+ multiplier := int64 (minMultiplier )
449+
450+ if delta > 0 {
451+ // Use crypto/rand for gosec compliance
452+ n , err := rand .Int (rand .Reader , big .NewInt (delta ))
453+ if err == nil {
454+ multiplier = n .Int64 () + minMultiplier
455+ }
456+ }
457+
458+ // 3. Apply the multiplier to the duration
459+ requeueAfter = time .Duration (multiplier ) * normalRequeueAfter
460+
461+ logger .V (logs .LogDebug ).Info ("increasing backoff due to consecutive failures" ,
462+ "consecutiveFailures" , maxFailures ,
463+ "multiplier" , multiplier ,
464+ "requeueAfter" , requeueAfter )
465+ }
466+
426467 logger .V (logs .LogInfo ).Error (err , "failed to deploy" )
427- return reconcile.Result {Requeue : true , RequeueAfter : normalRequeueAfter }, nil
468+ return reconcile.Result {Requeue : true , RequeueAfter : requeueAfter }, nil
428469 }
429470
430471 logger .V (logs .LogDebug ).Info ("Reconciling ClusterSummary success" )
0 commit comments