mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-20 13:30:46 +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>
45 lines
909 B
Go
45 lines
909 B
Go
package dailyrun
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestJitterBounds(t *testing.T) {
|
|
cases := []time.Duration{
|
|
200 * 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)
|
|
}
|
|
}
|