@@ -672,27 +672,27 @@ func setRetryingConditions(cos *ocv1.ClusterObjectSet, message string) {
672672// markAsProgressing sets the Progressing condition to True with the given reason.
673673//
674674// Once ProgressDeadlineExceeded has been set for the current generation, this function
675- // keeps that condition sticky for non-terminal progressing reasons that would otherwise
676- // cause the reconciler to oscillate between Progressing=True and
677- // ProgressDeadlineExceeded=False for the same generation.
675+ // blocks only the RollingOut reason to prevent a reconcile loop for Active revisions.
676+ // The loop would occur when reconcile() sees in-transition objects and sets
677+ // Progressing=True/RollingOut, then the progress deadline check immediately resets it
678+ // to ProgressDeadlineExceeded, causing a status-only update that triggers another reconcile.
678679//
679- // In particular, both RollingOut and Retrying are blocked for Active revisions.
680- // Allowing those reasons to overwrite ProgressDeadlineExceeded can trigger unnecessary
681- // status-only reconciles and interfere with retry/requeue behavior due to the progress
682- // deadline check resetting the condition.
680+ // Archived revisions are exempt because they skip progress deadline enforcement entirely,
681+ // so their status updates won't be overridden.
683682//
684- // Archived revisions are exempt from this guard because the progress deadline check
685- // does not apply to them, allowing archival teardown retries to show Retrying status.
683+ // Other reasons like Succeeded and Retrying are always allowed because:
684+ // - Succeeded represents terminal success (rollout eventually completed)
685+ // - Retrying represents transient errors that need to be visible in status
686686//
687- // If the generation changed (spec update) since ProgressDeadlineExceeded was recorded,
688- // the guard allows the update through so the condition reflects the new generation.
687+ // If the generation changed since ProgressDeadlineExceeded was recorded, the guard
688+ // allows all updates through so the condition reflects the new generation.
689689func markAsProgressing (cos * ocv1.ClusterObjectSet , reason , message string ) {
690690 if cnd := meta .FindStatusCondition (cos .Status .Conditions , ocv1 .ClusterObjectSetTypeProgressing ); cnd != nil &&
691691 cnd .Status == metav1 .ConditionFalse && cnd .Reason == ocv1 .ReasonProgressDeadlineExceeded &&
692692 cnd .ObservedGeneration == cos .Generation &&
693- ( reason == ocv1 .ReasonRollingOut || reason == ocv1 . ClusterObjectSetReasonRetrying ) &&
693+ reason == ocv1 .ReasonRollingOut &&
694694 cos .Spec .LifecycleState != ocv1 .ClusterObjectSetLifecycleStateArchived {
695- log .Log .V (1 ).Info ("skipping markAsProgressing: ProgressDeadlineExceeded is sticky for non-terminal progressing reasons " ,
695+ log .Log .V (1 ).Info ("skipping markAsProgressing: ProgressDeadlineExceeded is sticky for RollingOut on Active revisions " ,
696696 "requestedReason" , reason , "revision" , cos .Name , "lifecycleState" , cos .Spec .LifecycleState )
697697 return
698698 }
0 commit comments