Skip to content

Commit 058d03f

Browse files
authored
Re-use buffers when serialising chunks. (cortexproject#2505)
Improves performance of ingester handover and WAL checkpoint by reducing garbage. Signed-off-by: Bryan Boreham <bryan@weave.works>
1 parent b51a84a commit 058d03f

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

pkg/ingester/transfer.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -354,23 +354,29 @@ func (i *Ingester) TransferTSDB(stream client.Ingester_TransferTSDBServer) error
354354
// The passed wireChunks slice is for re-use.
355355
func toWireChunks(descs []*desc, wireChunks []client.Chunk) ([]client.Chunk, error) {
356356
if cap(wireChunks) < len(descs) {
357-
wireChunks = make([]client.Chunk, 0, len(descs))
357+
wireChunks = make([]client.Chunk, len(descs))
358+
} else {
359+
wireChunks = wireChunks[:len(descs)]
358360
}
359-
wireChunks = wireChunks[:0]
360-
for _, d := range descs {
361+
for i, d := range descs {
361362
wireChunk := client.Chunk{
362363
StartTimestampMs: int64(d.FirstTime),
363364
EndTimestampMs: int64(d.LastTime),
364365
Encoding: int32(d.C.Encoding()),
365366
}
366367

367-
buf := bytes.NewBuffer(make([]byte, 0, d.C.Size()))
368+
slice := wireChunks[i].Data[:0] // try to re-use the memory from last time
369+
if cap(slice) < d.C.Size() {
370+
slice = make([]byte, 0, d.C.Size())
371+
}
372+
buf := bytes.NewBuffer(slice)
373+
368374
if err := d.C.Marshal(buf); err != nil {
369375
return nil, err
370376
}
371377

372378
wireChunk.Data = buf.Bytes()
373-
wireChunks = append(wireChunks, wireChunk)
379+
wireChunks[i] = wireChunk
374380
}
375381
return wireChunks, nil
376382
}

pkg/ingester/wal.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ func (w *walWrapper) deleteCheckpoints(maxIndex int) (err error) {
447447
// checkpointSeries write the chunks of the series to the checkpoint.
448448
func (w *walWrapper) checkpointSeries(cp *wal.WAL, userID string, fp model.Fingerprint, series *memorySeries, wireChunks []client.Chunk, b []byte) ([]client.Chunk, []byte, error) {
449449
var err error
450-
wireChunks, err = toWireChunks(series.chunkDescs, wireChunks[:0])
450+
wireChunks, err = toWireChunks(series.chunkDescs, wireChunks)
451451
if err != nil {
452452
return wireChunks, b, err
453453
}

0 commit comments

Comments
 (0)