|
@@ -44,6 +44,9 @@ type WatchResponse struct {
|
|
|
// CompactRevision is set to the compaction revision that
|
|
// CompactRevision is set to the compaction revision that
|
|
|
// caused the watcher to cancel.
|
|
// caused the watcher to cancel.
|
|
|
CompactRevision int64
|
|
CompactRevision int64
|
|
|
|
|
+
|
|
|
|
|
+ // Canceled is 'true' when it has received wrong watch start revision.
|
|
|
|
|
+ Canceled bool
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// watcher implements the Watcher interface
|
|
// watcher implements the Watcher interface
|
|
@@ -165,12 +168,13 @@ func (w *watcher) addStream(resp *pb.WatchResponse, pendingReq *watchRequest) {
|
|
|
// no pending request; ignore
|
|
// no pending request; ignore
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- if resp.CompactRevision != 0 {
|
|
|
|
|
|
|
+ if resp.Canceled || resp.CompactRevision != 0 {
|
|
|
// compaction after start revision
|
|
// compaction after start revision
|
|
|
ret := make(chan WatchResponse, 1)
|
|
ret := make(chan WatchResponse, 1)
|
|
|
ret <- WatchResponse{
|
|
ret <- WatchResponse{
|
|
|
Header: *resp.Header,
|
|
Header: *resp.Header,
|
|
|
- CompactRevision: resp.CompactRevision}
|
|
|
|
|
|
|
+ CompactRevision: resp.CompactRevision,
|
|
|
|
|
+ Canceled: resp.Canceled}
|
|
|
close(ret)
|
|
close(ret)
|
|
|
pendingReq.retc <- ret
|
|
pendingReq.retc <- ret
|
|
|
return
|
|
return
|
|
@@ -251,13 +255,13 @@ func (w *watcher) run() {
|
|
|
// New events from the watch client
|
|
// New events from the watch client
|
|
|
case pbresp := <-w.respc:
|
|
case pbresp := <-w.respc:
|
|
|
switch {
|
|
switch {
|
|
|
- case pbresp.Canceled:
|
|
|
|
|
- delete(cancelSet, pbresp.WatchId)
|
|
|
|
|
case pbresp.Created:
|
|
case pbresp.Created:
|
|
|
// response to pending req, try to add
|
|
// response to pending req, try to add
|
|
|
w.addStream(pbresp, pendingReq)
|
|
w.addStream(pbresp, pendingReq)
|
|
|
pendingReq = nil
|
|
pendingReq = nil
|
|
|
curReqC = w.reqc
|
|
curReqC = w.reqc
|
|
|
|
|
+ case pbresp.Canceled:
|
|
|
|
|
+ delete(cancelSet, pbresp.WatchId)
|
|
|
default:
|
|
default:
|
|
|
// dispatch to appropriate watch stream
|
|
// dispatch to appropriate watch stream
|
|
|
if ok := w.dispatchEvent(pbresp); ok {
|
|
if ok := w.dispatchEvent(pbresp); ok {
|
|
@@ -317,7 +321,8 @@ func (w *watcher) dispatchEvent(pbresp *pb.WatchResponse) bool {
|
|
|
wr := &WatchResponse{
|
|
wr := &WatchResponse{
|
|
|
Header: *pbresp.Header,
|
|
Header: *pbresp.Header,
|
|
|
Events: pbresp.Events,
|
|
Events: pbresp.Events,
|
|
|
- CompactRevision: pbresp.CompactRevision}
|
|
|
|
|
|
|
+ CompactRevision: pbresp.CompactRevision,
|
|
|
|
|
+ Canceled: pbresp.Canceled}
|
|
|
ws.recvc <- wr
|
|
ws.recvc <- wr
|
|
|
}
|
|
}
|
|
|
return ok
|
|
return ok
|