func()

in pkg/apis/frameworkcontroller/v1/funcs.go [830:884]


func (rp RetryPolicySpec) ShouldRetry(
	rps RetryPolicyStatus,
	cs *CompletionStatus,
	minDelaySecForTransientConflictFailed int64,
	maxDelaySecForTransientConflictFailed int64) RetryDecision {
	ct := cs.Type

	// 0. Built-in Always-on RetryPolicy
	if cs.Code == CompletionCodeStopFrameworkRequested ||
		cs.Code == CompletionCodeFrameworkAttemptCompletion ||
		cs.Code == CompletionCodeDeleteTaskRequested {
		return RetryDecision{false, true, 0, fmt.Sprintf(
			"CompletionCode is %v, %v", cs.Code, cs.Phrase)}
	}

	// 1. FancyRetryPolicy
	if rp.FancyRetryPolicy {
		reason := fmt.Sprintf(
			"FancyRetryPolicy is %v and CompletionType is %v",
			rp.FancyRetryPolicy, ct)
		if ct.IsFailed() {
			if ct.ContainsAttribute(CompletionTypeAttributeTransient) {
				if ct.ContainsAttribute(CompletionTypeAttributeConflict) {
					return RetryDecision{true, false,
						common.RandInt64(
							minDelaySecForTransientConflictFailed,
							maxDelaySecForTransientConflictFailed),
						reason}
				} else {
					return RetryDecision{true, false, 0, reason}
				}
			} else if ct.ContainsAttribute(CompletionTypeAttributePermanent) {
				return RetryDecision{false, true, 0, reason}
			}
		}
	}

	// 2. NormalRetryPolicy
	if (rp.MaxRetryCount == ExtendedUnlimitedValue) ||
		(ct.IsFailed() && rp.MaxRetryCount == UnlimitedValue) ||
		(ct.IsFailed() && rps.AccountableRetriedCount < rp.MaxRetryCount) {
		return RetryDecision{true, true, 0, fmt.Sprintf(
			"AccountableRetriedCount %v has not reached MaxRetryCount %v",
			rps.AccountableRetriedCount, rp.MaxRetryCount)}
	} else {
		if ct.IsSucceeded() {
			return RetryDecision{false, true, 0, fmt.Sprintf(
				"CompletionType is %v", ct)}
		} else {
			return RetryDecision{false, true, 0, fmt.Sprintf(
				"AccountableRetriedCount %v has reached MaxRetryCount %v",
				rps.AccountableRetriedCount, rp.MaxRetryCount)}
		}
	}
}