Skip to content

Commit

Permalink
store: fix inconsistent error for series limits
Browse files Browse the repository at this point in the history
Signed-off-by: Thibault Mange <22740367+thibaultmg@users.noreply.github.com>
  • Loading branch information
thibaultmg committed May 2, 2023
1 parent a1ec4d5 commit c133aa4
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 0 deletions.
12 changes: 12 additions & 0 deletions pkg/store/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -1574,6 +1574,12 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq
s.mtx.RUnlock()

if err := g.Wait(); err != nil {
if statusErr, ok := status.FromError(err); ok {
if statusErr.Code() == codes.ResourceExhausted {
return nil, status.Error(codes.ResourceExhausted, err.Error())
}
}

return nil, status.Error(codes.Internal, err.Error())
}

Expand Down Expand Up @@ -1762,6 +1768,12 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR
s.mtx.RUnlock()

if err := g.Wait(); err != nil {
if statusErr, ok := status.FromError(err); ok {
if statusErr.Code() == codes.ResourceExhausted {
return nil, status.Error(codes.ResourceExhausted, err.Error())
}
}

return nil, status.Error(codes.Aborted, err.Error())
}

Expand Down
110 changes: 110 additions & 0 deletions pkg/store/bucket_e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package store
import (
"context"
"fmt"
"math"
"os"
"path/filepath"
"strings"
Expand Down Expand Up @@ -760,6 +761,57 @@ func TestBucketStore_LabelNames_e2e(t *testing.T) {
})
}

func TestBucketStore_LabelNames_SeriesLimiter_e2e(t *testing.T) {
cases := map[string]struct {
maxSeriesLimit uint64
expectedErr string
code codes.Code
}{
"should succeed if the max series limit is not exceeded": {
maxSeriesLimit: math.MaxUint64,
},
"should fail if the max series limit is exceeded - ResourceExhausted": {
expectedErr: "exceeded series limit",
maxSeriesLimit: 1,
code: codes.ResourceExhausted,
},
}

for testName, testData := range cases {
t.Run(testName, func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

bkt := objstore.NewInMemBucket()
dir := t.TempDir()
s := prepareStoreWithTestBlocks(t, dir, bkt, false, NewChunksLimiterFactory(0), NewSeriesLimiterFactory(testData.maxSeriesLimit), NewBytesLimiterFactory(0), emptyRelabelConfig, allowAllFilterConf)
testutil.Ok(t, s.store.SyncBlocks(ctx))
req := &storepb.LabelNamesRequest{
Matchers: []storepb.LabelMatcher{
{Type: storepb.LabelMatcher_EQ, Name: "a", Value: "1"},
},
Start: minTimeDuration.PrometheusTimestamp(),
End: maxTimeDuration.PrometheusTimestamp(),
}

s.cache.SwapWith(noopCache{})

_, err := s.store.LabelNames(context.Background(), req)

if testData.expectedErr == "" {
testutil.Ok(t, err)
} else {
testutil.NotOk(t, err)
testutil.Assert(t, strings.Contains(err.Error(), testData.expectedErr))

status, ok := status.FromError(err)
testutil.Equals(t, true, ok)
testutil.Equals(t, testData.code, status.Code())
}
})
}
}

func TestBucketStore_LabelValues_e2e(t *testing.T) {
objtesting.ForeachStore(t, func(t *testing.T, bkt objstore.Bucket) {
ctx, cancel := context.WithCancel(context.Background())
Expand Down Expand Up @@ -867,6 +919,64 @@ func TestBucketStore_LabelValues_e2e(t *testing.T) {
})
}

func TestBucketStore_LabelValues_ChunksLimiter_e2e(t *testing.T) {
cases := map[string]struct {
maxSeriesLimit uint64
expectedErr string
code codes.Code
}{
"should succeed if the max chunks limit is not exceeded": {
maxSeriesLimit: math.MaxUint64,
},
"should fail if the max series limit is exceeded - ResourceExhausted": {
expectedErr: "exceeded series limit",
maxSeriesLimit: 1,
code: codes.ResourceExhausted,
},
}

for testName, testData := range cases {
t.Run(testName, func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
bkt := objstore.NewInMemBucket()

dir := t.TempDir()

s := prepareStoreWithTestBlocks(t, dir, bkt, false, NewChunksLimiterFactory(0), NewSeriesLimiterFactory(testData.maxSeriesLimit), NewBytesLimiterFactory(0), emptyRelabelConfig, allowAllFilterConf)
testutil.Ok(t, s.store.SyncBlocks(ctx))

req := &storepb.LabelValuesRequest{
Label: "a",
Start: minTimeDuration.PrometheusTimestamp(),
End: maxTimeDuration.PrometheusTimestamp(),
Matchers: []storepb.LabelMatcher{
{
Type: storepb.LabelMatcher_EQ,
Name: "a",
Value: "1",
},
},
}

s.cache.SwapWith(noopCache{})

_, err := s.store.LabelValues(context.Background(), req)

if testData.expectedErr == "" {
testutil.Ok(t, err)
} else {
testutil.NotOk(t, err)
testutil.Assert(t, strings.Contains(err.Error(), testData.expectedErr))

status, ok := status.FromError(err)
testutil.Equals(t, true, ok)
testutil.Equals(t, testData.code, status.Code())
}
})
}
}

func emptyToNil(values []string) []string {
if len(values) == 0 {
return nil
Expand Down

0 comments on commit c133aa4

Please sign in to comment.