51 sor
1,2 KiB
Go
51 sor
1,2 KiB
Go
//Package backoff helps you at backing off !
|
|
//
|
|
//It was forked from github.com/cenkalti/backoff which is awesome.
|
|
//
|
|
//This BackOff sleeps upon BackOff() and calculates its next backoff time instead of returning the duration to sleep.
|
|
package backoff
|
|
|
|
import "time"
|
|
|
|
// Interface interface to use after a retryable operation failed.
|
|
// A Interface.BackOff sleeps.
|
|
type Interface interface {
|
|
// Example usage:
|
|
//
|
|
// for ;; {
|
|
// err, canRetry := somethingThatCanFail()
|
|
// if err != nil && canRetry {
|
|
// backoffer.Backoff()
|
|
// }
|
|
// }
|
|
BackOff()
|
|
|
|
// Reset to initial state.
|
|
Reset()
|
|
}
|
|
|
|
// ZeroBackOff is a fixed back-off policy whose back-off time is always zero,
|
|
// meaning that the operation is retried immediately without waiting.
|
|
type ZeroBackOff struct{}
|
|
|
|
var _ Interface = (*ZeroBackOff)(nil)
|
|
|
|
func (b *ZeroBackOff) Reset() {}
|
|
|
|
func (b *ZeroBackOff) BackOff() {}
|
|
|
|
type ConstantBackOff struct {
|
|
Interval time.Duration
|
|
}
|
|
|
|
var _ Interface = (*ConstantBackOff)(nil)
|
|
|
|
func (b *ConstantBackOff) Reset() {}
|
|
|
|
func (b *ConstantBackOff) BackOff() {
|
|
time.Sleep(b.Interval)
|
|
}
|
|
|
|
func NewConstant(d time.Duration) *ConstantBackOff {
|
|
return &ConstantBackOff{Interval: d}
|
|
}
|