@@ -111,14 +111,18 @@ func (s *Proxy) Serve(lis net.Listener) error {
111111 s .conns [st ] = true
112112 s .mu .Unlock ()
113113
114- go func () {
115- st .HandleStreams (func (stream * transport.Stream ) {
114+ var wg sync.WaitGroup
115+ st .HandleStreams (func (stream * transport.Stream ) {
116+ wg .Add (1 )
117+ go func () {
116118 s .handleStream (st , stream )
117- })
118- s .mu .Lock ()
119- delete (s .conns , st )
120- s .mu .Unlock ()
121- }()
119+ wg .Done ()
120+ }()
121+ })
122+ wg .Wait ()
123+ s .mu .Lock ()
124+ delete (s .conns , st )
125+ s .mu .Unlock ()
122126 }
123127}
124128
@@ -154,6 +158,7 @@ func (s *Proxy) handleStream(frontTrans transport.ServerTransport, frontStream *
154158 // data coming from backend back to client call
155159 egressPathChan := s .forwardDataFrames (backendStream , frontStream , frontTrans )
156160
161+ // wait for both data streams to complete.
157162 egressErr := <- egressPathChan
158163 ingressErr := <- ingressPathChan
159164 if egressErr != nil || ingressErr != nil {
@@ -179,8 +184,8 @@ func (s *Proxy) backendTransportStream(ctx context.Context) (transport.ClientTra
179184 return nil , nil , grpc .Errorf (codes .Aborted , "cant dial to backend: %v" , err )
180185 }
181186 }
182- // TODO(michal): PickTransport IS NOT IN UPSTREAM GRPC!
183- _ , backendTrans , err := grpcConn .PickTransport (ctx )
187+ // TODO(michal): ClientConn.Picker() IS NOT IN UPSTREAM GRPC! https://github.com/grpc/grpc-go/pull/397
188+ backendTrans , err := grpcConn .Picker (). Pick (ctx )
184189 frontendStream , _ := transport .StreamFromContext (ctx )
185190 callHdr := & transport.CallHdr {
186191 Method : frontendStream .Method (),
@@ -197,11 +202,13 @@ func (s *Proxy) backendTransportStream(ctx context.Context) (transport.ClientTra
197202// It returns an error channel. `nil` on it signifies everything was fine, anything else is a serious problem.
198203func (s * Proxy ) forwardDataFrames (srcStream * transport.Stream , dstStream * transport.Stream , dstTransport transportWriter ) chan error {
199204 ret := make (chan error )
205+
200206 go func () {
201207 data := make ([]byte , 4096 )
202208 opt := & transport.Options {}
203209 for {
204210 n , err := srcStream .Read (data )
211+
205212 if err == io .EOF {
206213 ret <- nil
207214 break
0 commit comments