Skip to content

Commit 7b1ed51

Browse files
authored
Avoid over allocating strings.Builder when creating cache key for expanded postings (#6451)
Signed-off-by: alanprot <[email protected]>
1 parent 5a78608 commit 7b1ed51

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

pkg/storage/tsdb/expanded_postings_cache.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ func (c *blocksPostingsForMatchersCache) fetchPostings(blockID ulid.ULID, ix tsd
208208
return nil, 0, err
209209
}
210210

211-
key := c.cacheKey(seed, blockID, ms...)
211+
key := cacheKey(seed, blockID, ms...)
212212
promise, loaded := cache.getPromiseForKey(key, fetch)
213213
if loaded {
214214
c.metrics.CacheHits.WithLabelValues(cache.name).Inc()
@@ -235,7 +235,7 @@ func (c *blocksPostingsForMatchersCache) getSeedForMetricName(metricName string)
235235
return c.seedByHash.getSeed(c.userId, metricName)
236236
}
237237

238-
func (c *blocksPostingsForMatchersCache) cacheKey(seed string, blockID ulid.ULID, ms ...*labels.Matcher) string {
238+
func cacheKey(seed string, blockID ulid.ULID, ms ...*labels.Matcher) string {
239239
slices.SortFunc(ms, func(i, j *labels.Matcher) int {
240240
if i.Type != j.Type {
241241
return int(i.Type - j.Type)
@@ -254,15 +254,16 @@ func (c *blocksPostingsForMatchersCache) cacheKey(seed string, blockID ulid.ULID
254254
sepLen = 1
255255
)
256256

257-
var size int
257+
size := len(seed) + len(blockID.String()) + 2*sepLen
258258
for _, m := range ms {
259-
size += len(seed) + len(blockID.String()) + len(m.Name) + len(m.Value) + typeLen + 2*sepLen
259+
size += len(m.Name) + len(m.Value) + typeLen + sepLen
260260
}
261261
sb := strings.Builder{}
262262
sb.Grow(size)
263263
sb.WriteString(seed)
264264
sb.WriteByte('|')
265265
sb.WriteString(blockID.String())
266+
sb.WriteByte('|')
266267
for _, m := range ms {
267268
sb.WriteString(m.Name)
268269
sb.WriteString(m.Type.String())

pkg/storage/tsdb/expanded_postings_cache_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,43 @@ import (
88
"testing"
99
"time"
1010

11+
"github.com/oklog/ulid"
1112
"github.com/prometheus/client_golang/prometheus"
1213
"github.com/prometheus/client_golang/prometheus/testutil"
14+
"github.com/prometheus/prometheus/model/labels"
1315
"github.com/stretchr/testify/require"
1416
"go.uber.org/atomic"
1517
)
1618

19+
func TestCacheKey(t *testing.T) {
20+
blockID := ulid.MustNew(1, nil)
21+
seed := "seed123"
22+
matchers := []*labels.Matcher{
23+
{
24+
Type: labels.MatchEqual,
25+
Name: "name_1",
26+
Value: "value_1",
27+
},
28+
{
29+
Type: labels.MatchNotEqual,
30+
Name: "name_2",
31+
Value: "value_2",
32+
},
33+
{
34+
Type: labels.MatchRegexp,
35+
Name: "name_3",
36+
Value: "value_4",
37+
},
38+
{
39+
Type: labels.MatchNotRegexp,
40+
Name: "name_5",
41+
Value: "value_4",
42+
},
43+
}
44+
r := cacheKey(seed, blockID, matchers...)
45+
require.Equal(t, "seed123|00000000010000000000000000|name_1=value_1|name_2!=value_2|name_3=~value_4|name_5!~value_4|", r)
46+
}
47+
1748
func Test_ShouldFetchPromiseOnlyOnce(t *testing.T) {
1849
cfg := PostingsCacheConfig{
1950
Enabled: true,

0 commit comments

Comments
 (0)