| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- // Copyright 2016 The etcd Authors
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package grpcproxy
- import (
- "github.com/coreos/etcd/clientv3"
- "golang.org/x/net/context"
- )
- type watcherSingle struct {
- // ch delievers events received from the etcd server
- ch clientv3.WatchChan
- // cancel is used to cancel the underlying etcd server watcher
- // It should also close the ch.
- cancel context.CancelFunc
- // sws is the stream this watcherSingle attached to
- sws *serverWatchStream
- w watcher
- lastStoreRev int64 // last seen revision of the remote mvcc store
- donec chan struct{}
- }
- func newWatcherSingle(wch clientv3.WatchChan, c context.CancelFunc, w watcher, sws *serverWatchStream) *watcherSingle {
- return &watcherSingle{
- sws: sws,
- ch: wch,
- cancel: c,
- w: w,
- donec: make(chan struct{}),
- }
- }
- func (ws watcherSingle) run() {
- defer close(ws.donec)
- for wr := range ws.ch {
- ws.lastStoreRev = wr.Header.Revision
- ws.w.send(wr)
- if ws.sws.maybeCoalesceWatcher(ws) {
- return
- }
- }
- }
- // canPromote returns true if a watcherSingle can promote itself to a watchergroup
- // when it already caught up with the last seen revision from the response header
- // of an etcd server.
- func (ws watcherSingle) canPromote() bool {
- return ws.w.rev == ws.lastStoreRev
- }
- func (ws watcherSingle) stop() {
- ws.cancel()
- <-ws.donec
- }
|