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) + }, +}