in clusterloader2/pkg/framework/client/objects.go [126:156]
func RetryFunction(f func() error, options ...*APICallOptions) wait.ConditionFunc {
var shouldAllowErrorFuncs, shouldRetryErrorFuncs []func(error) bool
for _, option := range options {
if option.shouldAllowError != nil {
shouldAllowErrorFuncs = append(shouldAllowErrorFuncs, option.shouldAllowError)
}
if option.shouldRetryError != nil {
shouldRetryErrorFuncs = append(shouldRetryErrorFuncs, option.shouldRetryError)
}
}
return func() (bool, error) {
err := f()
if err == nil {
return true, nil
}
if IsRetryableAPIError(err) || IsRetryableNetError(err) {
return false, nil
}
for _, shouldAllowError := range shouldAllowErrorFuncs {
if shouldAllowError(err) {
return true, nil
}
}
for _, shouldRetryError := range shouldRetryErrorFuncs {
if shouldRetryError(err) {
return false, nil
}
}
return false, err
}
}