package flaky
import (
)
type JitterProvider interface {
Jitter() Jitter
}
type Jitter func(v JitterInterval) time.Duration
func ( func( int64) int64) Jitter {
if == nil {
= rand.Int63n
}
return func( JitterInterval) time.Duration {
return randomJitter(, )
}
}
func ( JitterInterval, func( int64) int64) time.Duration {
:= int64(.L)
if == 0 {
return 0
}
:= < 0
if {
= -
}
:= () + 1
if {
, = -, -
}
if := .Q; != 0 {
-= /
}
return time.Duration()
}
type JitterInterval struct {
L time.Duration
Q int64
}
func ( Jitter) () Jitter {
return
}
type jitterSchedule struct {
jitter Jitter
interval JitterInterval
sched Schedule
}
func ( Jitter) ( Schedule, JitterInterval) Schedule {
return &jitterSchedule{
jitter: ,
sched: ,
interval: ,
}
}
func ( *jitterSchedule) ( time.Time) time.Time {
:= .sched.Next()
if .IsZero() || .Before() {
return
}
:= .jitter(.interval)
= .Add()
if .Before() {
return
}
return
}
func ( Jitter) ( Backoff, JitterInterval) Backoff {
return func( uint) (time.Duration, bool) {
, := ()
if ! {
return ,
}
return + (),
}
}