This is an automated email from the ASF dual-hosted git repository. liuhan pushed a commit to branch cache_bufio in repository https://gitbox.apache.org/repos/asf/skywalking-rover.git
commit fe5df6afb58e1302e85dea785c14f8cd2a3bf53b Author: mrproliu <[email protected]> AuthorDate: Mon Dec 23 12:07:14 2024 +0800 pooled bufio.Reader --- .../analyze/layer7/protocols/http1/reader/reader.go | 16 ++++++++++++++++ .../analyze/layer7/protocols/http1/reader/request.go | 5 ++++- .../analyze/layer7/protocols/http1/reader/response.go | 5 ++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/reader.go b/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/reader.go index 151e563..38af27d 100644 --- a/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/reader.go +++ b/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/reader.go @@ -26,6 +26,7 @@ import ( "net/http" "strconv" "strings" + "sync" "github.com/apache/skywalking-rover/pkg/logger" "github.com/apache/skywalking-rover/pkg/tools/buffer" @@ -38,6 +39,11 @@ var ( requestMethods = []string{ "GET", "POST", "OPTIONS", "HEAD", "PUT", "DELETE", "CONNECT", "TRACE", "PATCH", } + pooledReader = sync.Pool{ + New: func() any { + return bufio.NewReader(nil) + }, + } ) var log = logger.GetLogger("profiling", "task", "network", "layer7", "protocols", "http1", "reader") @@ -313,3 +319,13 @@ func (c *charsetReadWrapper) Read(p []byte) (n int, err error) { func (c *charsetReadWrapper) Close() error { return nil } + +func newPooledReaderFromBuffer(b *buffer.Buffer) *bufio.Reader { + reader := pooledReader.Get().(*bufio.Reader) + reader.Reset(b) + return reader +} + +func releasePooledReader(r *bufio.Reader) { + pooledReader.Put(r) +} diff --git a/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/request.go b/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/request.go index f966743..0134d8b 100644 --- a/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/request.go +++ b/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/request.go @@ -70,7 +70,10 @@ func (r *Request) Original() *http.Request { // nolint func (r *Reader) ReadRequest(buf *buffer.Buffer, readBody bool) (*Request, enums.ParseResult, error) { - bufReader := bufio.NewReader(buf) + bufReader := newPooledReaderFromBuffer(buf) + defer func() { + releasePooledReader(bufReader) + }() tp := textproto.NewReader(bufReader) req := &http.Request{} result := &Request{original: req, reader: r} diff --git a/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/response.go b/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/response.go index fae907b..3640df1 100644 --- a/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/response.go +++ b/pkg/profiling/task/network/analyze/layer7/protocols/http1/reader/response.go @@ -59,7 +59,10 @@ func (r *Response) Original() *http.Response { } func (r *Reader) ReadResponse(req *Request, buf *buffer.Buffer, readBody bool) (*Response, enums.ParseResult, error) { - bufReader := bufio.NewReader(buf) + bufReader := newPooledReaderFromBuffer(buf) + defer func() { + releasePooledReader(bufReader) + }() tp := textproto.NewReader(bufReader) resp := &http.Response{} result := &Response{original: resp, req: req, reader: r}
