diff --git a/tsdb/head_read.go b/tsdb/head_read.go index a963daa93..03e8d9ac5 100644 --- a/tsdb/head_read.go +++ b/tsdb/head_read.go @@ -113,7 +113,9 @@ func (h *headIndexReader) Postings(name string, values ...string) (index.Posting default: res := make([]index.Postings, 0, len(values)) for _, value := range values { - res = append(res, h.head.postings.Get(name, value)) + if p := h.head.postings.Get(name, value); !index.IsEmptyPostings(p) { + res = append(res, p) + } } return index.Merge(res...), nil } diff --git a/tsdb/index/postings.go b/tsdb/index/postings.go index fc78cc7a6..2e6781e11 100644 --- a/tsdb/index/postings.go +++ b/tsdb/index/postings.go @@ -428,6 +428,13 @@ func EmptyPostings() Postings { return emptyPostings } +// IsEmptyPostings returns true if the postings are an empty postings list. +// When this function returns false, it doesn't mean that the postings isn't empty +// (it could be an empty intersection of two non-empty postings, for example). +func IsEmptyPostings(p Postings) bool { + return p == emptyPostings +} + // ErrPostings returns new postings that immediately error. func ErrPostings(err error) Postings { return errPostings{err} diff --git a/tsdb/querier.go b/tsdb/querier.go index ed4c40e6b..6df4f2c9f 100644 --- a/tsdb/querier.go +++ b/tsdb/querier.go @@ -215,6 +215,9 @@ func PostingsForMatchers(ix IndexPostingsReader, ms ...*labels.Matcher) (index.P if err != nil { return nil, err } + if index.IsEmptyPostings(it) { + return index.EmptyPostings(), nil + } its = append(its, it) } else { // l="a" // Non-Not matcher, use normal postingsForMatcher. @@ -222,6 +225,9 @@ func PostingsForMatchers(ix IndexPostingsReader, ms ...*labels.Matcher) (index.P if err != nil { return nil, err } + if index.IsEmptyPostings(it) { + return index.EmptyPostings(), nil + } its = append(its, it) } } else { // l=""