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}

Reply via email to