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)