First process the pending messages in recv channel

Signed-off-by: Iceber Gu <wei.cai-nat@daocloud.io>
This commit is contained in:
Iceber Gu 2023-05-09 11:40:38 +08:00
parent 0ca69a9ca2
commit c51165f20d

View File

@ -483,14 +483,22 @@ func (c *Client) dispatch(ctx context.Context, req *Request, resp *Response) err
} }
defer c.deleteStream(s) defer c.deleteStream(s)
var msg *streamMessage
select { select {
case <-ctx.Done(): case <-ctx.Done():
return ctx.Err() return ctx.Err()
case <-c.ctx.Done(): case <-c.ctx.Done():
return ErrClosed return ErrClosed
case <-s.recvClose: case <-s.recvClose:
// If recv has a pending message, process that first
select {
case msg = <-s.recv:
default:
return s.recvErr return s.recvErr
case msg := <-s.recv: }
case msg = <-s.recv:
}
if msg.header.Type == messageTypeResponse { if msg.header.Type == messageTypeResponse {
err = proto.Unmarshal(msg.payload[:msg.header.Length], resp) err = proto.Unmarshal(msg.payload[:msg.header.Length], resp)
} else { } else {
@ -502,4 +510,3 @@ func (c *Client) dispatch(ctx context.Context, req *Request, resp *Response) err
return err return err
} }
}