瀏覽代碼

grpcproxy: do not resend create event after leader loss

Only set CreateNotify if no watch responses have been received.
Anthony Romano 9 年之前
父節點
當前提交
90ea3fbadc
共有 1 個文件被更改,包括 10 次插入3 次删除
  1. 10 3
      proxy/grpcproxy/watch_broadcast.go

+ 10 - 3
proxy/grpcproxy/watch_broadcast.go

@@ -54,13 +54,20 @@ func newWatchBroadcast(wp *watchProxy, w *watcher, update func(*watchBroadcast))
 		defer close(wb.donec)
 		// loop because leader loss will close channel
 		for cctx.Err() == nil {
-			wch := wp.cw.Watch(cctx, w.wr.key,
+			opts := []clientv3.OpOption{
 				clientv3.WithRange(w.wr.end),
 				clientv3.WithProgressNotify(),
-				clientv3.WithCreatedNotify(),
 				clientv3.WithRev(wb.nextrev),
 				clientv3.WithPrevKV(),
-			)
+			}
+			// The create notification should be the first response;
+			// if the watch is recreated following leader loss, it
+			// shouldn't post a second create response to the client.
+			if wb.responses == 0 {
+				opts = append(opts, clientv3.WithCreatedNotify())
+			}
+			wch := wp.cw.Watch(cctx, w.wr.key, opts...)
+
 			for wr := range wch {
 				wb.bcast(wr)
 				update(wb)