From 629cb7aa5e21901dfe8700ab56f452892d0dc557 Mon Sep 17 00:00:00 2001 From: Zeming YU Date: Tue, 6 Aug 2019 14:18:23 -0700 Subject: [PATCH] agent: fix a data race and deadlock add 1-size buffer for `errc` to avoid deadlock of child goroutine add a local variable to a void data race in `err` when `case <-stream.Context().Done():` is taken --- functional/agent/server.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/functional/agent/server.go b/functional/agent/server.go index a39f28e76..ea704933c 100644 --- a/functional/agent/server.go +++ b/functional/agent/server.go @@ -126,11 +126,12 @@ func (srv *Server) Stop() { } // Transport communicates with etcd tester. -func (srv *Server) Transport(stream rpcpb.Transport_TransportServer) (err error) { - errc := make(chan error) +func (srv *Server) Transport(stream rpcpb.Transport_TransportServer) (reterr error) { + errc := make(chan error, 1) go func() { for { var req *rpcpb.Request + var err error req, err = stream.Recv() if err != nil { errc <- err @@ -161,9 +162,9 @@ func (srv *Server) Transport(stream rpcpb.Transport_TransportServer) (err error) }() select { - case err = <-errc: + case reterr = <-errc: case <-stream.Context().Done(): - err = stream.Context().Err() + reterr = stream.Context().Err() } - return err + return reterr }