Browse Source

Merge pull request #5801 from heyitsanthony/fix-watch-closeerr-race

clientv3: only use return closeErr when donec is closed
Xiang Li 9 years ago
parent
commit
1b2f025414
1 changed files with 3 additions and 1 deletions
  1. 3 1
      clientv3/watch.go

+ 3 - 1
clientv3/watch.go

@@ -505,6 +505,7 @@ func (w *watchGrpcStream) serveWatchClient(wc pb.Watch_WatchClient) {
 
 
 // serveStream forwards watch responses from run() to the subscriber
 // serveStream forwards watch responses from run() to the subscriber
 func (w *watchGrpcStream) serveStream(ws *watcherStream) {
 func (w *watchGrpcStream) serveStream(ws *watcherStream) {
+	var closeErr error
 	emptyWr := &WatchResponse{}
 	emptyWr := &WatchResponse{}
 	wrs := []*WatchResponse{}
 	wrs := []*WatchResponse{}
 	resuming := false
 	resuming := false
@@ -569,13 +570,14 @@ func (w *watchGrpcStream) serveStream(ws *watcherStream) {
 			}
 			}
 		case <-w.donec:
 		case <-w.donec:
 			closing = true
 			closing = true
+			closeErr = w.closeErr
 		case <-ws.initReq.ctx.Done():
 		case <-ws.initReq.ctx.Done():
 			closing = true
 			closing = true
 		}
 		}
 	}
 	}
 
 
 	// try to send off close error
 	// try to send off close error
-	if w.closeErr != nil {
+	if closeErr != nil {
 		select {
 		select {
 		case ws.outc <- WatchResponse{closeErr: w.closeErr}:
 		case ws.outc <- WatchResponse{closeErr: w.closeErr}:
 		case <-w.donec:
 		case <-w.donec: