Skip to content

Commit

Permalink
Add: 0-copy reader
Browse files Browse the repository at this point in the history
  • Loading branch information
JimhHan authored and JimhHan committed Mar 13, 2021
1 parent 36fe98f commit eeb8b08
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 8 deletions.
16 changes: 16 additions & 0 deletions common/buf/buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,22 @@ func New() *Buffer {
}
}

func NewExisted(b []byte) *Buffer {
if cap(b) < Size {
panic("Invalid buffer")
}

oLen := len(b)
if oLen < Size {
b = append(b, make([]byte, Size-oLen)...)
}

return &Buffer{
v: b,
end: int32(oLen),
}
}

// StackNew creates a new Buffer object on stack.
// This method is for buffers that is released in the same function.
func StackNew() Buffer {
Expand Down
30 changes: 23 additions & 7 deletions transport/internet/grpc/encoding/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,18 +42,13 @@ func NewHunkConn(hc HunkConn, cancel context.CancelFunc) net.Conn {
}

func (h *HunkReaderWriter) forceFetch() error {
// clean up buffer, safety first!
h.buf = h.buf[:0]
h.index = 0

hunk := new(Hunk)
hunk.Data = h.buf
err := h.hc.RecvMsg(hunk)
hunk, err := h.hc.Recv()
if err != nil {
return newError("failed to fetch hunk from gRPC tunnel").Base(err)
}

h.buf = hunk.Data
h.index = 0

return nil
}
Expand All @@ -70,6 +65,27 @@ func (h *HunkReaderWriter) Read(buf []byte) (int, error) {
return n, nil
}

func (h *HunkReaderWriter) ReadMultiBuffer() (buf.MultiBuffer, error) {
if h.index >= len(h.buf) {
if err := h.forceFetch(); err != nil {
return nil, err
}
}

if cap(h.buf) == buf.Size {
b := h.buf
h.index = len(h.buf)
return buf.MultiBuffer{buf.NewExisted(b)}, nil
}

b := buf.New()
_, err := b.ReadFrom(h)
if err != nil {
return nil, err
}
return buf.MultiBuffer{b}, nil
}

func (h *HunkReaderWriter) Write(buf []byte) (int, error) {
err := h.hc.Send(&Hunk{Data: buf[:]})
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion transport/internet/grpc/encoding/stream.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit eeb8b08

Please sign in to comment.