mirror of https://github.com/k3s-io/k3s
37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
|
// Package retry provides a simple, stateless, functional mechanism to perform
|
||
|
// actions repetitively until successful.
|
||
|
//
|
||
|
// Copyright © 2016 Trevor N. Suarez (Rican7)
|
||
|
package retry
|
||
|
|
||
|
import "github.com/Rican7/retry/strategy"
|
||
|
|
||
|
// Action defines a callable function that package retry can handle.
|
||
|
type Action func(attempt uint) error
|
||
|
|
||
|
// Retry takes an action and performs it, repetitively, until successful.
|
||
|
//
|
||
|
// Optionally, strategies may be passed that assess whether or not an attempt
|
||
|
// should be made.
|
||
|
func Retry(action Action, strategies ...strategy.Strategy) error {
|
||
|
var err error
|
||
|
|
||
|
for attempt := uint(0); (0 == attempt || nil != err) && shouldAttempt(attempt, strategies...); attempt++ {
|
||
|
err = action(attempt)
|
||
|
}
|
||
|
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// shouldAttempt evaluates the provided strategies with the given attempt to
|
||
|
// determine if the Retry loop should make another attempt.
|
||
|
func shouldAttempt(attempt uint, strategies ...strategy.Strategy) bool {
|
||
|
shouldAttempt := true
|
||
|
|
||
|
for i := 0; shouldAttempt && i < len(strategies); i++ {
|
||
|
shouldAttempt = shouldAttempt && strategies[i](attempt)
|
||
|
}
|
||
|
|
||
|
return shouldAttempt
|
||
|
}
|