You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by sp...@apache.org on 2021/05/31 02:07:25 UTC

[apisix-go-plugin-runner] 18/22: perf: reuse objects

This is an automated email from the ASF dual-hosted git repository.

spacewander pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-go-plugin-runner.git

commit 8e69bfa957c36474d503209d6125e5402566e8f2
Author: spacewander <sp...@gmail.com>
AuthorDate: Wed May 26 14:40:39 2021 +0800

    perf: reuse objects
---
 internal/http/request.go       | 22 +++++++++++++++++++---
 internal/http/request_test.go  |  1 +
 internal/http/response.go      | 20 +++++++++++++++++++-
 internal/http/response_test.go |  1 +
 internal/plugin/plugin.go      |  3 +++
 5 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/internal/http/request.go b/internal/http/request.go
index 11c9ef4..c7f2e8d 100644
--- a/internal/http/request.go
+++ b/internal/http/request.go
@@ -17,6 +17,7 @@ package http
 import (
 	"net"
 	"net/http"
+	"sync"
 
 	pkgHTTP "github.com/apache/apisix-go-plugin-runner/pkg/http"
 	"github.com/api7/ext-plugin-proto/go/A6"
@@ -78,6 +79,11 @@ func (r *Request) Header() pkgHTTP.Header {
 	return r.hdr
 }
 
+func (r *Request) Reset() {
+	r.path = nil
+	r.hdr = nil
+}
+
 func (r *Request) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
 	if r.path == nil && r.hdr == nil {
 		return false
@@ -143,13 +149,23 @@ func (r *Request) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
 	return true
 }
 
+var reqPool = sync.Pool{
+	New: func() interface{} {
+		return &Request{}
+	},
+}
+
 func CreateRequest(buf []byte) *Request {
-	req := &Request{
-		r: hrc.GetRootAsReq(buf, 0),
-	}
+	req := reqPool.Get().(*Request)
+	req.r = hrc.GetRootAsReq(buf, 0)
 	return req
 }
 
+func ReuseRequest(r *Request) {
+	r.Reset()
+	reqPool.Put(r)
+}
+
 type Header struct {
 	http.Header
 }
diff --git a/internal/http/request_test.go b/internal/http/request_test.go
index 54fed1e..accaa38 100644
--- a/internal/http/request_test.go
+++ b/internal/http/request_test.go
@@ -116,6 +116,7 @@ func TestSrcIp(t *testing.T) {
 		out := buildReq(reqOpt{srcIP: ip})
 		r := CreateRequest(out)
 		assert.Equal(t, ip, r.SrcIP())
+		ReuseRequest(r)
 	}
 }
 
diff --git a/internal/http/response.go b/internal/http/response.go
index ef28b9a..d0aa8a4 100644
--- a/internal/http/response.go
+++ b/internal/http/response.go
@@ -17,6 +17,7 @@ package http
 import (
 	"bytes"
 	"net/http"
+	"sync"
 
 	"github.com/api7/ext-plugin-proto/go/A6"
 	hrc "github.com/api7/ext-plugin-proto/go/A6/HTTPReqCall"
@@ -51,6 +52,12 @@ func (r *Response) WriteHeader(statusCode int) {
 	r.code = statusCode
 }
 
+func (r *Response) Reset() {
+	r.body = nil
+	r.code = 0
+	r.hdr = nil
+}
+
 func (r *Response) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
 	if r.body == nil && r.code == 0 && len(r.hdr) == 0 {
 		return false
@@ -112,6 +119,17 @@ func (r *Response) FetchChanges(id uint32, builder *flatbuffers.Builder) bool {
 	return true
 }
 
+var respPool = sync.Pool{
+	New: func() interface{} {
+		return &Response{}
+	},
+}
+
 func CreateResponse() *Response {
-	return &Response{}
+	return respPool.Get().(*Response)
+}
+
+func ReuseResponse(r *Response) {
+	r.Reset()
+	respPool.Put(r)
 }
diff --git a/internal/http/response_test.go b/internal/http/response_test.go
index 5eddd4c..eadad62 100644
--- a/internal/http/response_test.go
+++ b/internal/http/response_test.go
@@ -41,6 +41,7 @@ func getStopAction(t *testing.T, b *flatbuffers.Builder) *hrc.Stop {
 
 func TestFetchChanges(t *testing.T) {
 	r := CreateResponse()
+	defer ReuseResponse(r)
 	r.Write([]byte("hello"))
 	h := r.Header()
 	h.Set("foo", "bar")
diff --git a/internal/plugin/plugin.go b/internal/plugin/plugin.go
index 3ca4159..b88ade7 100644
--- a/internal/plugin/plugin.go
+++ b/internal/plugin/plugin.go
@@ -45,7 +45,10 @@ func reportAction(id uint32, req *inHTTP.Request, resp *inHTTP.Response) *flatbu
 
 func HTTPReqCall(buf []byte) (*flatbuffers.Builder, error) {
 	req := inHTTP.CreateRequest(buf)
+	defer inHTTP.ReuseRequest(req)
+
 	resp := inHTTP.CreateResponse()
+	defer inHTTP.ReuseResponse(resp)
 
 	token := req.ConfToken()
 	conf, err := GetRuleConf(token)