diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go new file mode 100644 index 00000000..1441a8e5 --- /dev/null +++ b/internal/buffer/buffer.go @@ -0,0 +1,25 @@ +package buffer + +import "sync" + +type BufferPool struct { + pool *sync.Pool +} + +func NewBufferPool() *BufferPool { + return &BufferPool{ + pool: &sync.Pool{ + New: func() interface{} { + return make([]byte, 32*1024) + }, + }, + } +} + +func (p *BufferPool) Get() []byte { + return p.pool.Get().([]byte) +} + +func (p *BufferPool) Put(b []byte) { + p.pool.Put(b) +} diff --git a/internal/buffer/buffer_test.go b/internal/buffer/buffer_test.go new file mode 100644 index 00000000..76916b52 --- /dev/null +++ b/internal/buffer/buffer_test.go @@ -0,0 +1,16 @@ +package buffer + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestBufferPool(t *testing.T) { + t.Parallel() + + bufferPool := NewBufferPool() + b := bufferPool.Get() + require.Len(t, b, 32*1024) + bufferPool.Put(b) +} diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index faea712b..aa7d5458 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -16,6 +16,7 @@ import ( "github.com/go-logr/logr" + "github.com/spegel-org/spegel/internal/buffer" "github.com/spegel-org/spegel/internal/mux" "github.com/spegel-org/spegel/pkg/metrics" "github.com/spegel-org/spegel/pkg/oci" @@ -37,6 +38,7 @@ type Registry struct { resolveRetries int resolveTimeout time.Duration resolveLatestTag bool + bufferPool *buffer.BufferPool } type Option func(*Registry) @@ -90,6 +92,7 @@ func NewRegistry(ociClient oci.Client, router routing.Router, opts ...Option) *R resolveRetries: 3, resolveTimeout: 20 * time.Millisecond, resolveLatestTag: true, + bufferPool: buffer.NewBufferPool(), } for _, opt := range opts { opt(r) @@ -280,6 +283,7 @@ func (r *Registry) handleMirror(rw mux.ResponseWriter, req *http.Request, ref re Host: ipAddr.String(), } proxy := httputil.NewSingleHostReverseProxy(u) + proxy.BufferPool = r.bufferPool proxy.Transport = r.transport proxy.ErrorHandler = func(_ http.ResponseWriter, _ *http.Request, err error) { log.Error(err, "request to mirror failed", "attempt", mirrorAttempts)