You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.7 KiB
61 lines
1.7 KiB
package retry
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/aws/aws-sdk-go-v2/aws"
|
|
)
|
|
|
|
// IsErrorThrottle provides the interface of an implementation to determine if
|
|
// a error response from an operation is a throttling error.
|
|
type IsErrorThrottle interface {
|
|
IsErrorThrottle(error) aws.Ternary
|
|
}
|
|
|
|
// IsErrorThrottles is a collection of checks to determine of the error a
|
|
// throttle error. Iterates through the checks and returns the state of
|
|
// throttle if any check returns something other than unknown.
|
|
type IsErrorThrottles []IsErrorThrottle
|
|
|
|
// IsErrorThrottle returns if the error is a throttle error if any of the
|
|
// checks in the list return a value other than unknown.
|
|
func (r IsErrorThrottles) IsErrorThrottle(err error) aws.Ternary {
|
|
for _, re := range r {
|
|
if v := re.IsErrorThrottle(err); v != aws.UnknownTernary {
|
|
return v
|
|
}
|
|
}
|
|
return aws.UnknownTernary
|
|
}
|
|
|
|
// IsErrorThrottleFunc wraps a function with the IsErrorThrottle interface.
|
|
type IsErrorThrottleFunc func(error) aws.Ternary
|
|
|
|
// IsErrorThrottle returns if the error is a throttle error.
|
|
func (fn IsErrorThrottleFunc) IsErrorThrottle(err error) aws.Ternary {
|
|
return fn(err)
|
|
}
|
|
|
|
// ThrottleErrorCode determines if an attempt should be retried based on the
|
|
// API error code.
|
|
type ThrottleErrorCode struct {
|
|
Codes map[string]struct{}
|
|
}
|
|
|
|
// IsErrorThrottle return if the error is a throttle error based on the error
|
|
// codes. Returns unknown if the error doesn't have a code or it is unknown.
|
|
func (r ThrottleErrorCode) IsErrorThrottle(err error) aws.Ternary {
|
|
var v interface{ ErrorCode() string }
|
|
|
|
if !errors.As(err, &v) {
|
|
return aws.UnknownTernary
|
|
}
|
|
|
|
_, ok := r.Codes[v.ErrorCode()]
|
|
if !ok {
|
|
return aws.UnknownTernary
|
|
}
|
|
|
|
return aws.TrueTernary
|
|
}
|