mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-11 00:50:43 +02:00
* wdclient, dailyrun: add equal jitter to retry backoff Prevents thundering-herd retries when many clients recover from a transient failure at the same instant (e.g., filer restart, network partition healing). Uses equal jitter: wait in [d/2, d) instead of deterministic d. This bounds the maximum wait while still desynchronizing clients. Files: - weed/wdclient/filer_client.go (LookupVolumeIds retry loop) - weed/s3api/s3lifecycle/dailyrun/dispatch.go (dispatchWithRetry) Tests added for bounds, zero/negative inputs, and distribution sanity. Closes #9735 * wdclient: honor ctx cancellation during LookupVolumeIds backoff --------- Co-authored-by: Mohamed Chorfa <mohamed.chorfa@thalesgroup.com> Co-authored-by: Chris Lu <chris.lu@gmail.com>
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package wdclient
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestJitterBounds(t *testing.T) {
|
|
cases := []time.Duration{
|
|
1 * time.Millisecond,
|
|
100 * time.Millisecond,
|
|
1 * time.Second,
|
|
5 * time.Second,
|
|
}
|
|
|
|
for _, d := range cases {
|
|
for i := 0; i < 100; i++ {
|
|
j := jitter(d)
|
|
if j < d/2 {
|
|
t.Errorf("jitter(%v) = %v, below lower bound %v", d, j, d/2)
|
|
}
|
|
if j >= d {
|
|
t.Errorf("jitter(%v) = %v, at or above upper bound %v", d, j, d)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestJitterZeroAndNegative(t *testing.T) {
|
|
if j := jitter(0); j != 0 {
|
|
t.Errorf("jitter(0) = %v, want 0", j)
|
|
}
|
|
if j := jitter(-1 * time.Second); j != 0 {
|
|
t.Errorf("jitter(-1s) = %v, want 0", j)
|
|
}
|
|
}
|
|
|
|
func TestJitterTinyDuration(t *testing.T) {
|
|
// When d < 2, half == 0 and rand.Int63n(0) panics.
|
|
// We should return d unmodified in that case.
|
|
j := jitter(1 * time.Nanosecond)
|
|
if j != 1*time.Nanosecond {
|
|
t.Errorf("jitter(1ns) = %v, want 1ns", j)
|
|
}
|
|
}
|
|
|
|
func TestJitterDistribution(t *testing.T) {
|
|
const iterations = 10000
|
|
const base = 100 * time.Millisecond
|
|
var sum time.Duration
|
|
|
|
for i := 0; i < iterations; i++ {
|
|
j := jitter(base)
|
|
sum += j
|
|
}
|
|
|
|
avg := sum / iterations
|
|
// Equal jitter average should be around 75% of base (midpoint of [50%, 100%))
|
|
expected := base * 3 / 4
|
|
tolerance := base / 10 // ±10%
|
|
|
|
if avg < expected-tolerance || avg > expected+tolerance {
|
|
t.Errorf("average jitter %v deviated from expected %v", avg, expected)
|
|
}
|
|
}
|