diff --git a/tsdb/querier.go b/tsdb/querier.go index fe7f4c4a85..5c4a8a6983 100644 --- a/tsdb/querier.go +++ b/tsdb/querier.go @@ -380,7 +380,7 @@ func inversePostingsForMatcher(ctx context.Context, ix IndexPostingsReader, m *l const maxExpandedPostingsFactor = 100 // Division factor for maximum number of matched series. func labelValuesWithMatchers(ctx context.Context, r IndexReader, name string, matchers ...*labels.Matcher) ([]string, error) { - p, err := PostingsForMatchers(ctx, r, matchers...) + p, err := r.PostingsForMatchers(ctx, false, matchers...) if err != nil { return nil, errors.Wrap(err, "fetching postings for matchers") } diff --git a/tsdb/querier_test.go b/tsdb/querier_test.go index 7250450652..9916febef2 100644 --- a/tsdb/querier_test.go +++ b/tsdb/querier_test.go @@ -2914,9 +2914,25 @@ func TestLabelsValuesWithMatchersOptimization(t *testing.T) { for _, c := range cases { t.Run(c.name, func(t *testing.T) { - values, err := labelValuesWithMatchers(ctx, ir, c.labelName, c.matchers...) + cir := &indexReaderCountingPostingsForMatchersCalls{IndexReader: ir} + values, err := labelValuesWithMatchers(ctx, cir, c.labelName, c.matchers...) require.NoError(t, err) require.ElementsMatch(t, c.expectedResults, values) + require.Equal(t, 1, cir.postingsForMatchersCalls, + "expected PostingsForMatchers to be called once. "+ + "labelValuesWithMatchers should call the IndexReader.PostingsForMatchers instead of calling the package function PostingsForMatchers "+ + "because IndexReader may use the cached version of the PostingsForMatchers", + ) }) } } + +type indexReaderCountingPostingsForMatchersCalls struct { + IndexReader + postingsForMatchersCalls int +} + +func (f *indexReaderCountingPostingsForMatchersCalls) PostingsForMatchers(ctx context.Context, concurrent bool, ms ...*labels.Matcher) (index.Postings, error) { + f.postingsForMatchersCalls++ + return f.IndexReader.PostingsForMatchers(ctx, concurrent, ms...) +}