浏览代码

Merge pull request #6842 from heyitsanthony/watch-prevkv

grpcproxy: support prevKV watcher
Anthony Romano 9 年之前
父节点
当前提交
a2e86c1371
共有 3 个文件被更改,包括 15 次插入8 次删除
  1. 1 0
      proxy/grpcproxy/watch.go
  2. 1 0
      proxy/grpcproxy/watch_broadcast.go
  3. 13 8
      proxy/grpcproxy/watcher.go

+ 1 - 0
proxy/grpcproxy/watch.go

@@ -211,6 +211,7 @@ func (wps *watchProxyStream) recvLoop() error {
 
 				nextrev:  cr.StartRevision,
 				progress: cr.ProgressNotify,
+				prevKV:   cr.PrevKv,
 				filters:  v3rpc.FiltersFromRequest(cr),
 			}
 			if !w.wr.valid() {

+ 1 - 0
proxy/grpcproxy/watch_broadcast.go

@@ -59,6 +59,7 @@ func newWatchBroadcast(wp *watchProxy, w *watcher, update func(*watchBroadcast))
 				clientv3.WithProgressNotify(),
 				clientv3.WithCreatedNotify(),
 				clientv3.WithRev(wb.nextrev),
+				clientv3.WithPrevKV(),
 			)
 			for wr := range wch {
 				wb.bcast(wr)

+ 13 - 8
proxy/grpcproxy/watcher.go

@@ -37,6 +37,7 @@ type watcher struct {
 	wr       watchRange
 	filters  []mvcc.FilterFunc
 	progress bool
+	prevKV   bool
 
 	// id is the id returned to the client on its watch stream.
 	id int64
@@ -78,18 +79,22 @@ func (w *watcher) send(wr clientv3.WatchResponse) {
 		}
 
 		filtered := false
-		if len(w.filters) != 0 {
-			for _, filter := range w.filters {
-				if filter(*ev) {
-					filtered = true
-					break
-				}
+		for _, filter := range w.filters {
+			if filter(*ev) {
+				filtered = true
+				break
 			}
 		}
+		if filtered {
+			continue
+		}
 
-		if !filtered {
-			events = append(events, ev)
+		if !w.prevKV {
+			evCopy := *ev
+			evCopy.PrevKv = nil
+			ev = &evCopy
 		}
+		events = append(events, ev)
 	}
 
 	if lastRev >= w.nextrev {