diff --git a/etcdserver/api/v3rpc/watch.go b/etcdserver/api/v3rpc/watch.go index 65ad02d13..646d70f9f 100644 --- a/etcdserver/api/v3rpc/watch.go +++ b/etcdserver/api/v3rpc/watch.go @@ -17,6 +17,7 @@ package v3rpc import ( "context" "io" + "math/rand" "sync" "time" @@ -57,8 +58,15 @@ var ( func GetProgressReportInterval() time.Duration { progressReportIntervalMu.RLock() - defer progressReportIntervalMu.RUnlock() - return progressReportInterval + interval := progressReportInterval + progressReportIntervalMu.RUnlock() + + // add rand(1/10*progressReportInterval) as jitter so that etcdserver will not + // send progress notifications to watchers around the same time even when watchers + // are created around the same time (which is common when a client restarts itself). + jitter := time.Duration(rand.Int63n(int64(interval) / 10)) + + return interval + jitter } func SetProgressReportInterval(newTimeout time.Duration) {