Browse Source

grpcproxy: fix data race

Xiang Li 9 years ago
parent
commit
b982c80c14
2 changed files with 18 additions and 1 deletions
  1. 14 0
      proxy/grpcproxy/watch.go
  2. 4 1
      proxy/grpcproxy/watcher_single.go

+ 14 - 0
proxy/grpcproxy/watch.go

@@ -86,9 +86,23 @@ type serverWatchStream struct {
 func (sws *serverWatchStream) close() {
 	close(sws.watchCh)
 	close(sws.ctrlCh)
+
+	var wg sync.WaitGroup
+	sws.mu.Lock()
 	for _, ws := range sws.singles {
+		wg.Add(1)
 		ws.stop()
+		// copy the range variable to avoid race
+		copyws := ws
+		go func() {
+			<-copyws.stopNotify()
+			wg.Done()
+		}()
 	}
+	sws.mu.Unlock()
+
+	wg.Wait()
+
 	sws.groups.stop()
 }
 

+ 4 - 1
proxy/grpcproxy/watcher_single.go

@@ -70,5 +70,8 @@ func (ws watcherSingle) canPromote() bool {
 
 func (ws watcherSingle) stop() {
 	ws.cancel()
-	<-ws.donec
+}
+
+func (ws watcherSingle) stopNotify() <-chan struct{} {
+	return ws.donec
 }