chore(dataobj): pool instances of dataobj encoders (#16166)

pull/16167/head
Robert Fratto 11 months ago committed by GitHub
parent f22527f3d9
commit f71fc8afd3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 14
      pkg/dataobj/builder.go
  2. 15
      pkg/dataobj/pools.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)
}

@ -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)
},
}
Loading…
Cancel
Save