Handle buffer pool for oxy

This commit is contained in:
SALLEYRON Julien 2018-06-07 09:46:03 +02:00 committed by Traefiker Bot
parent 446d73fcf5
commit 62ded580ce
4 changed files with 44 additions and 1 deletions

2
Gopkg.lock generated
View file

@ -1217,7 +1217,7 @@
"roundrobin",
"utils"
]
revision = "7a2284ad8d6f4d362a6b38f3cdcc812291dce293"
revision = "d5b73186eed4aa34b52748699ad19e90f61d4059"
[[projects]]
name = "github.com/vulcand/predicate"

27
server/bufferpool.go Normal file
View file

@ -0,0 +1,27 @@
package server
import "sync"
const bufferPoolSize int = 32 * 1024
func newBufferPool() *bufferPool {
return &bufferPool{
pool: sync.Pool{
New: func() interface{} {
return make([]byte, bufferPoolSize)
},
},
}
}
type bufferPool struct {
pool sync.Pool
}
func (b *bufferPool) Get() []byte {
return b.pool.Get().([]byte)
}
func (b *bufferPool) Put(bytes []byte) {
b.pool.Put(bytes)
}

View file

@ -11,6 +11,7 @@ import (
stdlog "log"
"net"
"net/http"
"net/http/httputil"
"net/url"
"os"
"os/signal"
@ -75,6 +76,7 @@ type Server struct {
metricsRegistry metrics.Registry
provider provider.Provider
configurationListeners []func(types.Configuration)
bufferPool httputil.BufferPool
}
type serverEntryPoints map[string]*serverEntryPoint
@ -106,6 +108,8 @@ func NewServer(globalConfiguration configuration.GlobalConfiguration, provider p
server.globalConfiguration.API.CurrentConfigurations = &server.currentConfigurations
}
server.bufferPool = newBufferPool()
server.routinesPool = safe.NewPool(context.Background())
server.defaultForwardingRoundTripper = createHTTPTransport(globalConfiguration)
@ -1001,6 +1005,7 @@ func (s *Server) loadConfig(configurations types.Configurations, globalConfigura
forward.ErrorHandler(errorHandler),
forward.Rewriter(rewriter),
forward.ResponseModifier(responseModifier),
forward.BufferPool(s.bufferPool),
)
if err != nil {

View file

@ -85,6 +85,14 @@ func ErrorHandler(h utils.ErrorHandler) optSetter {
}
}
// BufferPool specifies a buffer pool for httputil.ReverseProxy.
func BufferPool(pool httputil.BufferPool) optSetter {
return func(f *Forwarder) error {
f.bufferPool = pool
return nil
}
}
// Stream specifies if HTTP responses should be streamed.
func Stream(stream bool) optSetter {
return func(f *Forwarder) error {
@ -176,6 +184,8 @@ type httpForwarder struct {
tlsClientConfig *tls.Config
log OxyLogger
bufferPool httputil.BufferPool
}
const (
@ -478,6 +488,7 @@ func (f *httpForwarder) serveHTTP(w http.ResponseWriter, inReq *http.Request, ct
Transport: f.roundTripper,
FlushInterval: f.flushInterval,
ModifyResponse: f.modifyResponse,
BufferPool: f.bufferPool,
}
revproxy.ServeHTTP(pw, outReq)