40 lines
992 B
Go
40 lines
992 B
Go
package job
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/cenkalti/backoff/v3"
|
|
)
|
|
|
|
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()
|
|
}
|