From f3d001df2ed018a7cd40a1f206a8bef57e3dd98d Mon Sep 17 00:00:00 2001 From: Oleg Zaytsev Date: Tue, 27 Dec 2022 18:13:56 +0100 Subject: [PATCH] Add shortcuts for empty postings Signed-off-by: Oleg Zaytsev --- tsdb/head_read.go | 4 +++- tsdb/index/postings.go | 7 +++++++ tsdb/querier.go | 6 ++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/tsdb/head_read.go b/tsdb/head_read.go index a963daa930..03e8d9ac58 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 fc78cc7a63..2e6781e117 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 ed4c40e6b8..6df4f2c9fb 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=""