Skip to content

Commit

Permalink
fix(netpoll): timeout when calling Next (#1580)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaost authored Oct 17, 2024
1 parent 811d888 commit 045c5ab
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
18 changes: 16 additions & 2 deletions pkg/remote/trans/netpoll/bytebuf.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,25 @@ func (b *netpollByteBuffer) ReadableLen() (n int) {
}

// Read implement io.Reader
func (b *netpollByteBuffer) Read(p []byte) (n int, err error) {
func (b *netpollByteBuffer) Read(p []byte) (int, error) {
if b.status&remote.BitReadable == 0 {
return -1, errors.New("unreadable buffer, cannot support Read")
}
rb, err := b.reader.Next(len(p))
// make sure we have at least one byte to read,
// or Next call may block till timeout
m := b.reader.Len()
if m == 0 {
_, err := b.reader.Peek(1)
if err != nil {
return 0, err
}
m = b.reader.Len() // must >= 1
}
n := len(p)
if n > m {
n = m
}
rb, err := b.reader.Next(n)
b.readSize += len(rb)
return copy(p, rb), err
}
Expand Down
12 changes: 12 additions & 0 deletions pkg/remote/trans/netpoll/bytebuf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,18 @@ func TestByteBuffer(t *testing.T) {
test.Assert(t, err == nil)
}

func TestByteBuffer_Read(t *testing.T) {
const teststr = "testing"
buf := &bytes.Buffer{}
buf.WriteString(teststr)
r := NewReaderByteBuffer(netpoll.NewReader(buf))
b := make([]byte, len(teststr)+1)
n, err := r.Read(b)
test.Assert(t, err == nil, err)
test.Assert(t, n == len(teststr), n)
test.Assert(t, string(b[:n]) == teststr)
}

// TestWriterBuffer test writerbytebufferr return writedirect err
func TestWriterBuffer(t *testing.T) {
// 1. prepare mock data
Expand Down

0 comments on commit 045c5ab

Please sign in to comment.