40 lines
984 B
Go
40 lines
984 B
Go
|
package job
|
||
|
|
||
|
import (
|
||
|
"github.com/cenk/backoff"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
_ backoff.BackOff = (*BackOff)(nil)
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
defaultMinJobInterval = 30 * time.Second
|
||
|
)
|
||
|
|
||
|
// BackOff is an exponential backoff implementation for long running jobs.
|
||
|
// In long running jobs, an operation() that fails after a long Duration should not increments the backoff period.
|
||
|
// If operation() takes more than MinJobInterval, Reset() is called in NextBackOff().
|
||
|
type BackOff struct {
|
||
|
*backoff.ExponentialBackOff
|
||
|
MinJobInterval time.Duration
|
||
|
}
|
||
|
|
||
|
// NewBackOff creates an instance of BackOff using default values.
|
||
|
func NewBackOff(backOff *backoff.ExponentialBackOff) *BackOff {
|
||
|
backOff.MaxElapsedTime = 0
|
||
|
return &BackOff{
|
||
|
ExponentialBackOff: backOff,
|
||
|
MinJobInterval: defaultMinJobInterval,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// NextBackOff calculates the next backoff interval.
|
||
|
func (b *BackOff) NextBackOff() time.Duration {
|
||
|
if b.GetElapsedTime() >= b.MinJobInterval {
|
||
|
b.Reset()
|
||
|
}
|
||
|
return b.ExponentialBackOff.NextBackOff()
|
||
|
}
|