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)}
}
}
}