Skip to content

Commit 52be0a5

Browse files
author
Michal Witkowski
committed
bugfix: fix gRPC Java deadlock, due to different dispatch logic
1 parent 822df7d commit 52be0a5

File tree

1 file changed

+6
-10
lines changed

1 file changed

+6
-10
lines changed

proxy.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ func ProxyStream(director StreamDirector, logger grpclog.Logger, frontTrans tran
183183
// wait for both data streams to complete.
184184
egressErr := <-egressPathChan
185185
ingressErr := <-ingressPathChan
186-
if egressErr != nil || ingressErr != nil {
186+
if egressErr != io.EOF || ingressErr != io.EOF {
187187
logger.Printf("proxy: Proxy.handleStream %v failure during transfer ingres: %v egress: %v", frontStream.Method(), ingressErr, egressErr)
188188
frontTrans.WriteStatus(frontStream, codes.Unavailable, fmt.Sprintf("problem in transfer ingress: %v egress: %v", ingressErr, egressErr))
189189
return
@@ -223,18 +223,17 @@ func backendTransportStream(director StreamDirector, ctx context.Context) (trans
223223
// forwardDataFrames moves data from one gRPC transport `Stream` to another in async fashion.
224224
// It returns an error channel. `nil` on it signifies everything was fine, anything else is a serious problem.
225225
func forwardDataFrames(srcStream *transport.Stream, dstStream *transport.Stream, dstTransport transportWriter) chan error {
226-
ret := make(chan error)
226+
ret := make(chan error, 1)
227227

228228
go func() {
229229
data := make([]byte, 4096)
230230
opt := &transport.Options{}
231231
for {
232232
n, err := srcStream.Read(data)
233-
234-
if err == io.EOF {
235-
ret <- nil
236-
break
237-
} else if err != nil {
233+
if err != nil { // including io.EOF
234+
// Send nil to terminate the stream.
235+
opt.Last = true
236+
dstTransport.Write(dstStream, nil, opt)
238237
ret <- err
239238
break
240239
}
@@ -243,9 +242,6 @@ func forwardDataFrames(srcStream *transport.Stream, dstStream *transport.Stream,
243242
break
244243
}
245244
}
246-
// Send nil to terminate the stream.
247-
opt.Last = true
248-
dstTransport.Write(dstStream, nil, opt)
249245
close(ret)
250246
}()
251247
return ret

0 commit comments

Comments
 (0)