[TESTS] Faster WAL Benchmarks by reusing buffer

Less garbage collection.

Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
Bryan Boreham 2025-04-16 17:55:45 +01:00
parent b4d3c06acb
commit 848df13d3a

View File

@ -149,24 +149,29 @@ func BenchmarkHeadAppender_Append_Commit_ExistingSeries(b *testing.B) {
} }
} }
func populateTestWL(t testing.TB, w *wlog.WL, recs []interface{}) { func populateTestWL(t testing.TB, w *wlog.WL, recs []interface{}, buf []byte) []byte {
var enc record.Encoder var enc record.Encoder
for _, r := range recs { for _, r := range recs {
buf = buf[:0]
switch v := r.(type) { switch v := r.(type) {
case []record.RefSeries: case []record.RefSeries:
require.NoError(t, w.Log(enc.Series(v, nil))) buf = enc.Series(v, buf)
case []record.RefSample: case []record.RefSample:
require.NoError(t, w.Log(enc.Samples(v, nil))) buf = enc.Samples(v, buf)
case []tombstones.Stone: case []tombstones.Stone:
require.NoError(t, w.Log(enc.Tombstones(v, nil))) buf = enc.Tombstones(v, buf)
case []record.RefExemplar: case []record.RefExemplar:
require.NoError(t, w.Log(enc.Exemplars(v, nil))) buf = enc.Exemplars(v, buf)
case []record.RefMmapMarker: case []record.RefMmapMarker:
require.NoError(t, w.Log(enc.MmapMarkers(v, nil))) buf = enc.MmapMarkers(v, buf)
case []record.RefMetadata: case []record.RefMetadata:
require.NoError(t, w.Log(enc.Metadata(v, nil))) buf = enc.Metadata(v, buf)
default:
continue
} }
require.NoError(t, w.Log(buf))
} }
return buf
} }
func readTestWAL(t testing.TB, dir string) (recs []interface{}) { func readTestWAL(t testing.TB, dir string) (recs []interface{}) {
@ -309,6 +314,7 @@ func BenchmarkLoadWLs(b *testing.B) {
// Write series. // Write series.
refSeries := make([]record.RefSeries, 0, c.seriesPerBatch) refSeries := make([]record.RefSeries, 0, c.seriesPerBatch)
var buf []byte
for k := 0; k < c.batches; k++ { for k := 0; k < c.batches; k++ {
refSeries = refSeries[:0] refSeries = refSeries[:0]
for i := k * c.seriesPerBatch; i < (k+1)*c.seriesPerBatch; i++ { for i := k * c.seriesPerBatch; i < (k+1)*c.seriesPerBatch; i++ {
@ -333,7 +339,7 @@ func BenchmarkLoadWLs(b *testing.B) {
writeSeries = newWriteSeries writeSeries = newWriteSeries
} }
populateTestWL(b, wal, []interface{}{writeSeries}) buf = populateTestWL(b, wal, []interface{}{writeSeries}, buf)
} }
// Write samples. // Write samples.
@ -359,7 +365,7 @@ func BenchmarkLoadWLs(b *testing.B) {
V: float64(i) * 100, V: float64(i) * 100,
}) })
} }
populateTestWL(b, wal, []interface{}{refSamples}) buf = populateTestWL(b, wal, []interface{}{refSamples}, buf)
} }
} }
@ -398,7 +404,7 @@ func BenchmarkLoadWLs(b *testing.B) {
Labels: labels.FromStrings("trace_id", fmt.Sprintf("trace-%d", i)), Labels: labels.FromStrings("trace_id", fmt.Sprintf("trace-%d", i)),
}) })
} }
populateTestWL(b, wal, []interface{}{refExemplars}) buf = populateTestWL(b, wal, []interface{}{refExemplars}, buf)
} }
} }
@ -427,10 +433,10 @@ func BenchmarkLoadWLs(b *testing.B) {
}) })
} }
if shouldAddMarkers { if shouldAddMarkers {
populateTestWL(b, wbl, []interface{}{refMarkers}) populateTestWL(b, wbl, []interface{}{refMarkers}, buf)
} }
populateTestWL(b, wal, []interface{}{refSamples}) buf = populateTestWL(b, wal, []interface{}{refSamples}, buf)
populateTestWL(b, wbl, []interface{}{refSamples}) buf = populateTestWL(b, wbl, []interface{}{refSamples}, buf)
} }
} }
@ -739,7 +745,7 @@ func TestHead_ReadWAL(t *testing.T) {
require.NoError(t, head.Close()) require.NoError(t, head.Close())
}() }()
populateTestWL(t, w, entries) populateTestWL(t, w, entries, nil)
require.NoError(t, head.Init(math.MinInt64)) require.NoError(t, head.Init(math.MinInt64))
require.Equal(t, uint64(101), head.lastSeriesID.Load()) require.Equal(t, uint64(101), head.lastSeriesID.Load())
@ -1383,7 +1389,7 @@ func TestHeadDeleteSeriesWithoutSamples(t *testing.T) {
require.NoError(t, head.Close()) require.NoError(t, head.Close())
}() }()
populateTestWL(t, w, entries) populateTestWL(t, w, entries, nil)
require.NoError(t, head.Init(math.MinInt64)) require.NoError(t, head.Init(math.MinInt64))