From f71fc8afd32eb4263dd0580dfd739555d9f47aff Mon Sep 17 00:00:00 2001 From: Robert Fratto Date: Mon, 10 Feb 2025 12:11:47 -0500 Subject: [PATCH] chore(dataobj): pool instances of dataobj encoders (#16166) --- pkg/dataobj/builder.go | 14 ++++++-------- pkg/dataobj/pools.go | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 pkg/dataobj/pools.go diff --git a/pkg/dataobj/builder.go b/pkg/dataobj/builder.go index fefe62cb1c..fa8f551956 100644 --- a/pkg/dataobj/builder.go +++ b/pkg/dataobj/builder.go @@ -110,8 +110,6 @@ type Builder struct { logs *logs.Logs state builderState - - encoder *encoding.Encoder } type builderState int @@ -160,8 +158,6 @@ func NewBuilder(cfg BuilderConfig) (*Builder, error) { BufferSize: int(cfg.BufferSize), SectionSize: int(cfg.TargetSectionSize), }), - - encoder: encoding.NewEncoder(nil), }, nil } @@ -290,13 +286,15 @@ func (b *Builder) buildObject(output *bytes.Buffer) error { initialBufferSize := output.Len() - b.encoder.Reset(output) + enc := encoderPool.Get().(*encoding.Encoder) + enc.Reset(output) + defer encoderPool.Put(enc) - if err := b.streams.EncodeTo(b.encoder); err != nil { + if err := b.streams.EncodeTo(enc); err != nil { return fmt.Errorf("encoding streams: %w", err) - } else if err := b.logs.EncodeTo(b.encoder); err != nil { + } else if err := b.logs.EncodeTo(enc); err != nil { return fmt.Errorf("encoding logs: %w", err) - } else if err := b.encoder.Flush(); err != nil { + } else if err := enc.Flush(); err != nil { return fmt.Errorf("encoding object: %w", err) } diff --git a/pkg/dataobj/pools.go b/pkg/dataobj/pools.go new file mode 100644 index 0000000000..1b614c4cd7 --- /dev/null +++ b/pkg/dataobj/pools.go @@ -0,0 +1,15 @@ +package dataobj + +import ( + "sync" + + "github.com/grafana/loki/v3/pkg/dataobj/internal/encoding" +) + +// encoderPool holds a pool of [encoding.Encoder] instances. Callers must +// always reset pooled encoders before use. +var encoderPool = sync.Pool{ + New: func() any { + return encoding.NewEncoder(nil) + }, +}