Skip to content

Commit ad279e5

Browse files
authored
fix(blooms): bloomshipper no longer returns empty metas on fetch (#13130)
Traced some bloom compactor problems to this store interface returning empty `Metas` (with the exception of the reference key) on fetch when the object does not exist in storage. I originally found this due to a panic in the outdated meta removal code because empty `Metas` don't have any source TSDBs. Fixes the impl to only return metas which existed which have their contents populated.
1 parent cd64d6d commit ad279e5

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

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

+11-3
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ func (b *BloomClient) Stop() {
386386
}
387387

388388
func (b *BloomClient) GetMetas(ctx context.Context, refs []MetaRef) ([]Meta, error) {
389-
results := make([]Meta, len(refs))
389+
results := make([]*Meta, len(refs))
390390
err := concurrency.ForEachJob(ctx, len(refs), b.concurrency, func(ctx context.Context, idx int) error {
391391
meta, err := b.GetMeta(ctx, refs[idx])
392392
if err != nil {
@@ -395,11 +395,19 @@ func (b *BloomClient) GetMetas(ctx context.Context, refs []MetaRef) ([]Meta, err
395395
return fmt.Errorf("failed to get meta file %s: %w", key, err)
396396
}
397397
level.Error(b.logger).Log("msg", "failed to get meta file", "ref", key, "err", err)
398+
return nil
398399
}
399-
results[idx] = meta
400+
results[idx] = &meta
400401
return nil
401402
})
402-
return results, err
403+
404+
filtered := make([]Meta, 0, len(results))
405+
for _, r := range results {
406+
if r != nil {
407+
filtered = append(filtered, *r)
408+
}
409+
}
410+
return filtered, err
403411
}
404412

405413
// GetMeta fetches the meta file for given MetaRef from object storage and

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ func TestBloomClient_GetMetas(t *testing.T) {
107107
require.Equal(t, metas, []Meta{m1, m2})
108108
})
109109

110-
t.Run("does not exist - yields empty meta", func(t *testing.T) {
111-
ref := MetaRef{
110+
t.Run("does not exist - skips empty meta", func(t *testing.T) {
111+
notExist := MetaRef{
112112
Ref: Ref{
113113
TenantID: "tenant",
114114
TableName: "table",
@@ -118,9 +118,9 @@ func TestBloomClient_GetMetas(t *testing.T) {
118118
Checksum: 1234,
119119
},
120120
}
121-
metas, err := c.GetMetas(ctx, []MetaRef{ref})
121+
metas, err := c.GetMetas(ctx, []MetaRef{notExist, m1.MetaRef})
122122
require.NoError(t, err)
123-
require.Equal(t, metas, []Meta{{MetaRef: ref}})
123+
require.Equal(t, metas, []Meta{m1})
124124
})
125125
}
126126

0 commit comments

Comments
 (0)