Skip to content

Commit 6e9db73

Browse files
committed
Share Config for Expanded Postings Cache Size Across All Tenants
Signed-off-by: alanprot <[email protected]>
1 parent 1369b45 commit 6e9db73

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

pkg/storage/tsdb/expanded_postings_cache.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strconv"
99
"strings"
1010
"sync"
11+
"sync/atomic"
1112
"time"
1213

1314
"github.com/oklog/ulid"
@@ -100,6 +101,9 @@ func (cfg *PostingsCacheConfig) RegisterFlagsWithPrefix(prefix, block string, f
100101
type ExpandedPostingsCacheFactory struct {
101102
seedByHash *seedByHash
102103
cfg TSDBPostingsCacheConfig
104+
105+
headCachedBytes atomic.Int64
106+
blocksCachedBytes atomic.Int64
103107
}
104108

105109
func NewExpandedPostingsCacheFactory(cfg TSDBPostingsCacheConfig) *ExpandedPostingsCacheFactory {
@@ -118,7 +122,7 @@ func NewExpandedPostingsCacheFactory(cfg TSDBPostingsCacheConfig) *ExpandedPosti
118122
}
119123

120124
func (f *ExpandedPostingsCacheFactory) NewExpandedPostingsCache(userId string, metrics *ExpandedPostingsCacheMetrics) ExpandedPostingsCache {
121-
return newBlocksPostingsForMatchersCache(userId, f.cfg, metrics, f.seedByHash)
125+
return newBlocksPostingsForMatchersCache(userId, f.cfg, metrics, f.seedByHash, &f.headCachedBytes, &f.blocksCachedBytes)
122126
}
123127

124128
type ExpandedPostingsCache interface {
@@ -138,7 +142,7 @@ type blocksPostingsForMatchersCache struct {
138142
seedByHash *seedByHash
139143
}
140144

141-
func newBlocksPostingsForMatchersCache(userId string, cfg TSDBPostingsCacheConfig, metrics *ExpandedPostingsCacheMetrics, seedByHash *seedByHash) ExpandedPostingsCache {
145+
func newBlocksPostingsForMatchersCache(userId string, cfg TSDBPostingsCacheConfig, metrics *ExpandedPostingsCacheMetrics, seedByHash *seedByHash, headCachedBytes, blocksCachedBytes *atomic.Int64) ExpandedPostingsCache {
142146
if cfg.PostingsForMatchers == nil {
143147
cfg.PostingsForMatchers = tsdb.PostingsForMatchers
144148
}
@@ -148,8 +152,8 @@ func newBlocksPostingsForMatchersCache(userId string, cfg TSDBPostingsCacheConfi
148152
}
149153

150154
return &blocksPostingsForMatchersCache{
151-
headCache: newFifoCache[[]storage.SeriesRef](cfg.Head, "head", metrics, cfg.timeNow),
152-
blocksCache: newFifoCache[[]storage.SeriesRef](cfg.Blocks, "block", metrics, cfg.timeNow),
155+
headCache: newFifoCache[[]storage.SeriesRef](cfg.Head, headCachedBytes, "head", metrics, cfg.timeNow),
156+
blocksCache: newFifoCache[[]storage.SeriesRef](cfg.Blocks, blocksCachedBytes, "block", metrics, cfg.timeNow),
153157
postingsForMatchersFunc: cfg.PostingsForMatchers,
154158
timeNow: cfg.timeNow,
155159
metrics: metrics,
@@ -333,17 +337,18 @@ type fifoCache[V any] struct {
333337
// Fields from here should be locked
334338
cachedMtx sync.RWMutex
335339
cached *list.List
336-
cachedBytes int64
340+
cachedBytes *atomic.Int64
337341
}
338342

339-
func newFifoCache[V any](cfg PostingsCacheConfig, name string, metrics *ExpandedPostingsCacheMetrics, timeNow func() time.Time) *fifoCache[V] {
343+
func newFifoCache[V any](cfg PostingsCacheConfig, cachedBytes *atomic.Int64, name string, metrics *ExpandedPostingsCacheMetrics, timeNow func() time.Time) *fifoCache[V] {
340344
return &fifoCache[V]{
341345
cachedValues: new(sync.Map),
342346
cached: list.New(),
343347
cfg: cfg,
344348
timeNow: timeNow,
345349
name: name,
346350
metrics: *metrics,
351+
cachedBytes: cachedBytes,
347352
}
348353
}
349354

@@ -417,7 +422,7 @@ func (c *fifoCache[V]) shouldEvictHead() (string, bool) {
417422
return "", false
418423
}
419424

420-
if c.cachedBytes > c.cfg.MaxBytes {
425+
if c.cachedBytes.Load() > c.cfg.MaxBytes {
421426
return "full", true
422427
}
423428

@@ -437,7 +442,7 @@ func (c *fifoCache[V]) evictHead() {
437442
c.cached.Remove(front)
438443
oldestKey := front.Value.(string)
439444
if oldest, loaded := c.cachedValues.LoadAndDelete(oldestKey); loaded {
440-
c.cachedBytes -= oldest.(*cacheEntryPromise[V]).sizeBytes
445+
c.cachedBytes.Add(-oldest.(*cacheEntryPromise[V]).sizeBytes)
441446
}
442447
}
443448

@@ -449,7 +454,7 @@ func (c *fifoCache[V]) created(key string, sizeBytes int64) {
449454
c.cachedMtx.Lock()
450455
defer c.cachedMtx.Unlock()
451456
c.cached.PushBack(key)
452-
c.cachedBytes += sizeBytes
457+
c.cachedBytes.Add(sizeBytes)
453458
}
454459

455460
func (c *fifoCache[V]) updateSize(oldSize, newSizeBytes int64) {
@@ -459,7 +464,7 @@ func (c *fifoCache[V]) updateSize(oldSize, newSizeBytes int64) {
459464

460465
c.cachedMtx.Lock()
461466
defer c.cachedMtx.Unlock()
462-
c.cachedBytes += newSizeBytes - oldSize
467+
c.cachedBytes.Add(newSizeBytes - oldSize)
463468
}
464469

465470
type cacheEntryPromise[V any] struct {

pkg/storage/tsdb/expanded_postings_cache_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"strings"
77
"sync"
8+
"sync/atomic"
89
"testing"
910
"time"
1011

@@ -13,7 +14,6 @@ import (
1314
"github.com/prometheus/client_golang/prometheus/testutil"
1415
"github.com/prometheus/prometheus/model/labels"
1516
"github.com/stretchr/testify/require"
16-
"go.uber.org/atomic"
1717
)
1818

1919
func TestCacheKey(t *testing.T) {
@@ -52,14 +52,14 @@ func Test_ShouldFetchPromiseOnlyOnce(t *testing.T) {
5252
MaxBytes: 10 << 20,
5353
}
5454
m := NewPostingCacheMetrics(prometheus.NewPedanticRegistry())
55-
cache := newFifoCache[int](cfg, "test", m, time.Now)
55+
cache := newFifoCache[int](cfg, &atomic.Int64{}, "test", m, time.Now)
5656
calls := atomic.Int64{}
5757
concurrency := 100
5858
wg := sync.WaitGroup{}
5959
wg.Add(concurrency)
6060

6161
fetchFunc := func() (int, int64, error) {
62-
calls.Inc()
62+
calls.Add(1)
6363
time.Sleep(100 * time.Millisecond)
6464
return 0, 0, nil
6565
}
@@ -81,7 +81,7 @@ func TestFifoCacheDisabled(t *testing.T) {
8181
cfg.Enabled = false
8282
m := NewPostingCacheMetrics(prometheus.NewPedanticRegistry())
8383
timeNow := time.Now
84-
cache := newFifoCache[int](cfg, "test", m, timeNow)
84+
cache := newFifoCache[int](cfg, &atomic.Int64{}, "test", m, timeNow)
8585
old, loaded := cache.getPromiseForKey("key1", func() (int, int64, error) {
8686
return 1, 0, nil
8787
})
@@ -124,7 +124,8 @@ func TestFifoCacheExpire(t *testing.T) {
124124
r := prometheus.NewPedanticRegistry()
125125
m := NewPostingCacheMetrics(r)
126126
timeNow := time.Now
127-
cache := newFifoCache[int](c.cfg, "test", m, timeNow)
127+
cachedBytes := atomic.Int64{}
128+
cache := newFifoCache[int](c.cfg, &cachedBytes, "test", m, timeNow)
128129

129130
for i := 0; i < numberOfKeys; i++ {
130131
key := RepeatStringIfNeeded(fmt.Sprintf("key%d", i), keySize)
@@ -169,15 +170,15 @@ func TestFifoCacheExpire(t *testing.T) {
169170

170171
for i := 0; i < numberOfKeys; i++ {
171172
key := RepeatStringIfNeeded(fmt.Sprintf("key%d", i), keySize)
172-
originalSize := cache.cachedBytes
173+
originalSize := cache.cachedBytes.Load()
173174
p, loaded := cache.getPromiseForKey(key, func() (int, int64, error) {
174175
return 2, 18, nil
175176
})
176177
require.False(t, loaded)
177178
// New value
178179
require.Equal(t, 2, p.v)
179180
// Total Size Updated
180-
require.Equal(t, originalSize+10, cache.cachedBytes)
181+
require.Equal(t, originalSize+10, cache.cachedBytes.Load())
181182
}
182183

183184
err := testutil.GatherAndCompare(r, bytes.NewBufferString(fmt.Sprintf(`

0 commit comments

Comments
 (0)