浏览代码

grpcproxy: only return ctx error in chan stream if recvc is empty

Since select{} won't prioritize, ctx.Done() can sometimes override
a pending message on recvc. Loop if recvc has messages instead.

Fixes #7340
Anthony Romano 8 年之前
父节点
当前提交
29a6fd65ad
共有 1 个文件被更改,包括 15 次插入9 次删除
  1. 15 9
      proxy/grpcproxy/chan_stream.go

+ 15 - 9
proxy/grpcproxy/chan_stream.go

@@ -116,17 +116,23 @@ func (s *chanStream) SendMsg(m interface{}) error {
 
 
 func (s *chanStream) RecvMsg(m interface{}) error {
 func (s *chanStream) RecvMsg(m interface{}) error {
 	v := m.(*interface{})
 	v := m.(*interface{})
-	select {
-	case msg, ok := <-s.recvc:
-		if !ok {
-			return grpc.ErrClientConnClosing
+	for {
+		select {
+		case msg, ok := <-s.recvc:
+			if !ok {
+				return grpc.ErrClientConnClosing
+			}
+			if err, ok := msg.(error); ok {
+				return err
+			}
+			*v = msg
+			return nil
+		case <-s.ctx.Done():
 		}
 		}
-		if err, ok := msg.(error); ok {
-			return err
+		if len(s.recvc) == 0 {
+			// prioritize any pending recv messages over canceled context
+			break
 		}
 		}
-		*v = msg
-		return nil
-	case <-s.ctx.Done():
 	}
 	}
 	return s.ctx.Err()
 	return s.ctx.Err()
 }
 }