lotus/lib/retry/retry.go

38 lines
837 B
Go
Raw Normal View History

package retry
import (
"errors"
2022-08-18 21:55:56 +00:00
"reflect"
"time"
logging "github.com/ipfs/go-log/v2"
)
var log = logging.Logger("retry")
2022-08-22 21:32:43 +00:00
func ErrorIsIn(err error, errorTypes []error) bool {
for _, etype := range errorTypes {
2022-08-18 21:55:56 +00:00
tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface()
if errors.As(err, tmp) {
return true
}
}
return false
}
2022-08-22 21:32:43 +00:00
func Retry[T any](attempts int, initialBackoff time.Duration, errorTypes []error, f func() (T, error)) (result T, err error) {
for i := 0; i < attempts; i++ {
if i > 0 {
log.Info("Retrying after error:", err)
2022-08-22 21:32:43 +00:00
time.Sleep(initialBackoff)
initialBackoff *= 2
}
result, err = f()
2022-08-22 21:32:43 +00:00
if err == nil || !ErrorIsIn(err, errorTypes) {
2022-08-19 15:33:37 +00:00
return result, err
}
}
log.Errorf("Failed after %d attempts, last error: %s", attempts, err)
return result, err
}