Skip to content

Commit 8f4561f

Browse files
ecksunbrian-brazil
authored andcommitted
Bugfix/jitter (prometheus-community#66)
* bugfix: Update jitter time on error Previously the jitter time was never updated, which means that it was always 1 ns. * Switch jitter to use time.Duration This makes it clear that the jitter is tiny, between 1 and 10 ns. * Change jitter times to be (50ms, 5s) * Let decorrelatedJitter.calc() return Duration
1 parent d946edf commit 8f4561f

File tree

2 files changed

+21
-13
lines changed

2 files changed

+21
-13
lines changed

client/client.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"crypto/x509"
99
"fmt"
1010
"io/ioutil"
11-
"math"
1211
"math/rand"
1312
"net"
1413
"net/http"
@@ -191,26 +190,33 @@ func loop(c Coordinator, client *http.Client) error {
191190

192191
// decorrelated Jitter increases the maximum jitter based on the last random value.
193192
type decorrelatedJitter struct {
194-
duration float64 // sleep time
195-
min float64 // min sleep time
196-
cap float64 // max sleep time
193+
duration time.Duration // sleep time
194+
min time.Duration // min sleep time
195+
cap time.Duration // max sleep time
197196
}
198197

199198
func newJitter() decorrelatedJitter {
200199
rand.Seed(time.Now().UnixNano())
201200
return decorrelatedJitter{
202-
duration: 1,
203-
min: 1,
204-
cap: 10,
201+
min: 50 * time.Millisecond,
202+
cap: 5 * time.Second,
205203
}
206204
}
207205

208-
func (d *decorrelatedJitter) calc() {
209-
d.duration = math.Min(d.cap, d.min+rand.Float64()*(d.duration*3-d.min))
206+
func (d *decorrelatedJitter) calc() time.Duration {
207+
change := rand.Float64() * float64(d.duration*time.Duration(3)-d.min)
208+
d.duration = d.min + time.Duration(change)
209+
if d.duration > d.cap {
210+
d.duration = d.cap
211+
}
212+
if d.duration < d.min {
213+
d.duration = d.min
214+
}
215+
return d.duration
210216
}
211217

212218
func (d *decorrelatedJitter) sleep() {
213-
time.Sleep(time.Duration(d.duration))
219+
time.Sleep(d.calc())
214220
}
215221

216222
func main() {

client/client_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import (
1111

1212
func TestJitter(t *testing.T) {
1313
jitter := newJitter()
14-
jitter.calc()
15-
if !(jitter.min <= jitter.duration || jitter.duration <= jitter.cap) {
16-
t.Fatal("invalid jitter value: ", jitter.duration)
14+
for i := 0; i < 100000; i++ {
15+
duration := jitter.calc()
16+
if !(jitter.min <= duration || duration <= jitter.cap) {
17+
t.Fatal("invalid jitter value: ", duration)
18+
}
1719
}
1820
}
1921

0 commit comments

Comments
 (0)