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", "roundrobin",
"utils" "utils"
] ]
revision = "7a2284ad8d6f4d362a6b38f3cdcc812291dce293" revision = "d5b73186eed4aa34b52748699ad19e90f61d4059"
[[projects]] [[projects]]
name = "github.com/vulcand/predicate" 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" stdlog "log"
"net" "net"
"net/http" "net/http"
"net/http/httputil"
"net/url" "net/url"
"os" "os"
"os/signal" "os/signal"
@ -75,6 +76,7 @@ type Server struct {
metricsRegistry metrics.Registry metricsRegistry metrics.Registry
provider provider.Provider provider provider.Provider
configurationListeners []func(types.Configuration) configurationListeners []func(types.Configuration)
bufferPool httputil.BufferPool
} }
type serverEntryPoints map[string]*serverEntryPoint type serverEntryPoints map[string]*serverEntryPoint
@ -106,6 +108,8 @@ func NewServer(globalConfiguration configuration.GlobalConfiguration, provider p
server.globalConfiguration.API.CurrentConfigurations = &server.currentConfigurations server.globalConfiguration.API.CurrentConfigurations = &server.currentConfigurations
} }
server.bufferPool = newBufferPool()
server.routinesPool = safe.NewPool(context.Background()) server.routinesPool = safe.NewPool(context.Background())
server.defaultForwardingRoundTripper = createHTTPTransport(globalConfiguration) server.defaultForwardingRoundTripper = createHTTPTransport(globalConfiguration)
@ -1001,6 +1005,7 @@ func (s *Server) loadConfig(configurations types.Configurations, globalConfigura
forward.ErrorHandler(errorHandler), forward.ErrorHandler(errorHandler),
forward.Rewriter(rewriter), forward.Rewriter(rewriter),
forward.ResponseModifier(responseModifier), forward.ResponseModifier(responseModifier),
forward.BufferPool(s.bufferPool),
) )
if err != nil { 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. // Stream specifies if HTTP responses should be streamed.
func Stream(stream bool) optSetter { func Stream(stream bool) optSetter {
return func(f *Forwarder) error { return func(f *Forwarder) error {
@ -176,6 +184,8 @@ type httpForwarder struct {
tlsClientConfig *tls.Config tlsClientConfig *tls.Config
log OxyLogger log OxyLogger
bufferPool httputil.BufferPool
} }
const ( const (
@ -478,6 +488,7 @@ func (f *httpForwarder) serveHTTP(w http.ResponseWriter, inReq *http.Request, ct
Transport: f.roundTripper, Transport: f.roundTripper,
FlushInterval: f.flushInterval, FlushInterval: f.flushInterval,
ModifyResponse: f.modifyResponse, ModifyResponse: f.modifyResponse,
BufferPool: f.bufferPool,
} }
revproxy.ServeHTTP(pw, outReq) revproxy.ServeHTTP(pw, outReq)