Browse Source

v3rpc: add jitter to progress notification

Xiang 7 years ago
parent
commit
142bff89f4
1 changed files with 10 additions and 2 deletions
  1. 10 2
      etcdserver/api/v3rpc/watch.go

+ 10 - 2
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) {