Skip to content

Commit 667076d

Browse files
authored
fix(blooms): Do not fail requests when fetching metas from cache fails (#12838)
The bloom shipper uses metas to resolve available blocks. Metas are fetched from cache, and if not available from object storage. If fetching metas from cache fails, e.g. timeout, the request should not fail, but proceed as if no metas were available. Signed-off-by: Christian Haudum <[email protected]>
1 parent d751134 commit 667076d

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

pkg/storage/chunk/cache/mock.go

+16-1
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,27 @@ type MockCache interface {
1313
GetInternal() map[string][]byte
1414
KeysRequested() int
1515
GetKeys() []string
16+
SetErr(error, error)
1617
}
1718

1819
type mockCache struct {
1920
numKeyUpdates int
2021
keysRequested int
2122
sync.Mutex
22-
cache map[string][]byte
23+
cache map[string][]byte
24+
storeErr error // optional error that is returned when calling Store()
25+
fetchErr error // optional error that is returned when calling Fetch()
26+
}
27+
28+
func (m *mockCache) SetErr(storeErr, fetchErr error) {
29+
m.storeErr, m.fetchErr = storeErr, fetchErr
2330
}
2431

2532
func (m *mockCache) Store(_ context.Context, keys []string, bufs [][]byte) error {
33+
if m.storeErr != nil {
34+
return m.storeErr
35+
}
36+
2637
m.Lock()
2738
defer m.Unlock()
2839
for i := range keys {
@@ -33,6 +44,10 @@ func (m *mockCache) Store(_ context.Context, keys []string, bufs [][]byte) error
3344
}
3445

3546
func (m *mockCache) Fetch(_ context.Context, keys []string) (found []string, bufs [][]byte, missing []string, err error) {
47+
if m.fetchErr != nil {
48+
return nil, nil, nil, m.fetchErr
49+
}
50+
3651
m.Lock()
3752
defer m.Unlock()
3853
for _, key := range keys {

pkg/storage/stores/shipper/bloomshipper/fetcher.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ func (f *Fetcher) FetchMetas(ctx context.Context, refs []MetaRef) ([]Meta, error
129129
}
130130
cacheHits, cacheBufs, _, err := f.metasCache.Fetch(ctx, keys)
131131
if err != nil {
132-
return nil, err
132+
level.Error(f.logger).Log("msg", "failed to fetch metas from cache", "err", err)
133+
return nil, nil
133134
}
134135

135136
fromCache, missing, err := f.processMetasCacheResponse(ctx, refs, cacheHits, cacheBufs)

pkg/storage/stores/shipper/bloomshipper/fetcher_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"time"
1212

1313
"github.com/go-kit/log"
14+
"github.com/pkg/errors"
1415
"github.com/prometheus/common/model"
1516
"github.com/stretchr/testify/require"
1617

@@ -72,6 +73,7 @@ func TestMetasFetcher(t *testing.T) {
7273
start []Meta // initial cache state
7374
end []Meta // final cache state
7475
fetch []Meta // metas to fetch
76+
err error // error that is returned when calling cache.Fetch()
7577
}{
7678
{
7779
name: "all metas found in cache",
@@ -94,12 +96,22 @@ func TestMetasFetcher(t *testing.T) {
9496
end: makeMetas(t, schemaCfg, now, []v1.FingerprintBounds{{Min: 0x0000, Max: 0xffff}, {Min: 0x10000, Max: 0x1ffff}}),
9597
fetch: makeMetas(t, schemaCfg, now, []v1.FingerprintBounds{{Min: 0x0000, Max: 0xffff}, {Min: 0x10000, Max: 0x1ffff}}),
9698
},
99+
{
100+
name: "error fetching metas yields empty result",
101+
err: errors.New("failed to fetch"),
102+
store: makeMetas(t, schemaCfg, now, []v1.FingerprintBounds{{Min: 0x0000, Max: 0xffff}, {Min: 0x10000, Max: 0x1ffff}}),
103+
start: makeMetas(t, schemaCfg, now, []v1.FingerprintBounds{{Min: 0x0000, Max: 0xffff}}),
104+
end: makeMetas(t, schemaCfg, now, []v1.FingerprintBounds{{Min: 0x0000, Max: 0xffff}}),
105+
fetch: []Meta{},
106+
},
97107
}
98108

99109
for _, test := range tests {
100110
t.Run(test.name, func(t *testing.T) {
101111
ctx := context.Background()
102112
metasCache := cache.NewMockCache()
113+
metasCache.SetErr(nil, test.err)
114+
103115
cfg := bloomStoreConfig{workingDirs: []string{t.TempDir()}, numWorkers: 1}
104116

105117
oc, err := local.NewFSObjectClient(local.FSConfig{Directory: dir})

0 commit comments

Comments
 (0)