mvcc/watcher.go
func (ws *watchStream) Watch(id WatchID, key, end []byte, startRev int64, fcs ...FilterFunc) (WatchID, error) {
	// prevent wrong range where key >= end lexicographically
	// watch request with 'WithFromKey' has empty-byte range end
	if len(end) != 0 && bytes.Compare(key, end) != -1 {
		return -1, ErrEmptyWatcherRange
	}

	ws.mu.Lock()
	defer ws.mu.Unlock()
	if ws.closed {
		return -1, ErrEmptyWatcherRange
	}

	if id == AutoWatchID {
		for ws.watchers[ws.nextID] != nil {
			ws.nextID++
		}
		id = ws.nextID
		ws.nextID++
	} else if _, ok := ws.watchers[id]; ok {
		return -1, ErrWatcherDuplicateID
	}

	w, c := ws.watchable.watch(key, end, startRev, id, ws.ch, fcs...)

	ws.cancels[id] = c
	ws.watchers[id] = w
	return id, nil
}
func (ws *watchStream) Watch(id WatchID, key, end []byte, startRev int64, fcs ...FilterFunc) (WatchID, error) {
	// prevent wrong range where key >= end lexicographically
	// watch request with 'WithFromKey' has empty-byte range end
	if len(end) != 0 && bytes.Compare(key, end) != -1 {
		return -1, ErrEmptyWatcherRange
	}

	ws.mu.Lock()
	defer ws.mu.Unlock()
	if ws.closed {
		return -1, ErrEmptyWatcherRange
	}

	if id == AutoWatchID {
		for ws.watchers[ws.nextID] != nil {
			ws.nextID++
		}
		id = ws.nextID
		ws.nextID++
	} else if _, ok := ws.watchers[id]; ok {
		return -1, ErrWatcherDuplicateID
	}

	w, c := ws.watchable.watch(key, end, startRev, id, ws.ch, fcs...)

	ws.cancels[id] = c
	ws.watchers[id] = w
	return id, nil
}
func ( ws * watchStream ) Watch ( id WatchID , key , end [ ] byte , startRev int64 , fcs ... FilterFunc ) ( WatchID , error ) { // prevent wrong range where key >= end lexicographically // watch request with 'WithFromKey' has empty-byte range end if len ( end ) != 0 && bytes . Compare ( key , end ) != - 1 { return - 1 , ErrEmptyWatcherRange } ws . mu . Lock ( ) defer ws . mu . Unlock ( ) if ws . closed { return - 1 , ErrEmptyWatcherRange } if id == AutoWatchID { for ws . watchers [ ws . nextID ] != nil { ws . nextID ++ } id = ws . nextID ws . nextID ++ } else if _ , ok := ws . watchers [ id ] ; ok { return - 1 , ErrWatcherDuplicateID } w , c := ws . watchable . watch ( key , end , startRev , id , ws . ch , fcs ... ) ws . cancels [ id ] = c ws . watchers [ id ] = w return id , nil }
// Watch creates a new watcher in the stream and returns its WatchID.
Watch creates a new watcher in the stream and returns its WatchID .