dont create new reader in recvMsg (#940)

This commit is contained in:
apolcyn
2017-06-22 10:37:15 -07:00
committed by MakMukhi
parent 306d7d084b
commit 79fc236e5f

View File

@ -21,7 +21,6 @@
package transport // import "google.golang.org/grpc/transport" package transport // import "google.golang.org/grpc/transport"
import ( import (
"bytes"
"fmt" "fmt"
"io" "io"
"net" "net"
@ -109,7 +108,7 @@ type recvBufferReader struct {
ctx context.Context ctx context.Context
goAway chan struct{} goAway chan struct{}
recv *recvBuffer recv *recvBuffer
last *bytes.Reader // Stores the remaining data in the previous calls. last []byte // Stores the remaining data in the previous calls.
err error err error
} }
@ -121,9 +120,11 @@ func (r *recvBufferReader) Read(p []byte) (n int, err error) {
return 0, r.err return 0, r.err
} }
defer func() { r.err = err }() defer func() { r.err = err }()
if r.last != nil && r.last.Len() > 0 { if r.last != nil && len(r.last) > 0 {
// Read remaining data left in last call. // Read remaining data left in last call.
return r.last.Read(p) copied := copy(p, r.last)
r.last = r.last[copied:]
return copied, nil
} }
select { select {
case <-r.ctx.Done(): case <-r.ctx.Done():
@ -136,8 +137,9 @@ func (r *recvBufferReader) Read(p []byte) (n int, err error) {
if m.err != nil { if m.err != nil {
return 0, m.err return 0, m.err
} }
r.last = bytes.NewReader(m.data) copied := copy(p, m.data)
return r.last.Read(p) r.last = m.data[copied:]
return copied, nil
} }
} }