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
This commit is contained in:
Zeming YU 2019-08-06 14:18:23 -07:00
parent 44a00a33ef
commit c762a3d7f7

View File

@ -126,11 +126,12 @@ func (srv *Server) Stop() {
} }
// Transport communicates with etcd tester. // Transport communicates with etcd tester.
func (srv *Server) Transport(stream rpcpb.Transport_TransportServer) (err error) { func (srv *Server) Transport(stream rpcpb.Transport_TransportServer) (reterr error) {
errc := make(chan error) errc := make(chan error, 1)
go func() { go func() {
for { for {
var req *rpcpb.Request var req *rpcpb.Request
var err error
req, err = stream.Recv() req, err = stream.Recv()
if err != nil { if err != nil {
errc <- err errc <- err
@ -161,9 +162,9 @@ func (srv *Server) Transport(stream rpcpb.Transport_TransportServer) (err error)
}() }()
select { select {
case err = <-errc: case reterr = <-errc:
case <-stream.Context().Done(): case <-stream.Context().Done():
err = stream.Context().Err() reterr = stream.Context().Err()
} }
return err return reterr
} }