func (wps *watchProxyStream) recvLoop() error { for { req, err := wps.stream.Recv() if err != nil { return err } switch uv := req.RequestUnion.(type) { case *pb.WatchRequest_CreateRequest: cr := uv.CreateRequest w := &watcher{ wr: watchRange{string(cr.Key), string(cr.RangeEnd)}, id: wps.nextWatcherID, wps: wps, nextrev: cr.StartRevision, progress: cr.ProgressNotify, prevKV: cr.PrevKv, filters: v3rpc.FiltersFromRequest(cr), } if !w.wr.valid() { w.post(&pb.WatchResponse{WatchId: -1, Created: true, Canceled: true}) continue } wps.nextWatcherID++ w.nextrev = cr.StartRevision wps.watchers[w.id] = w wps.ranges.add(w) case *pb.WatchRequest_CancelRequest: wps.delete(uv.CancelRequest.WatchId) default: panic("not implemented") } } }
func (sws *serverWatchStream) recvLoop() error { defer sws.close() for { req, err := sws.gRPCStream.Recv() if err == io.EOF { return nil } if err != nil { return err } switch uv := req.RequestUnion.(type) { case *pb.WatchRequest_CreateRequest: cr := uv.CreateRequest watcher := watcher{ wr: watchRange{ key: string(cr.Key), end: string(cr.RangeEnd), }, id: sws.nextWatcherID, ch: sws.watchCh, progress: cr.ProgressNotify, filters: v3rpc.FiltersFromRequest(cr), } if cr.StartRevision != 0 { sws.addDedicatedWatcher(watcher, cr.StartRevision) } else { sws.addCoalescedWatcher(watcher) } wresp := &pb.WatchResponse{ Header: &pb.ResponseHeader{}, // TODO: fill in header WatchId: sws.nextWatcherID, Created: true, } sws.nextWatcherID++ select { case sws.ctrlCh <- wresp: default: panic("handle this") } case *pb.WatchRequest_CancelRequest: sws.removeWatcher(uv.CancelRequest.WatchId) default: panic("not implemented") } } }