Skip to content

Commit

Permalink
Implementing Regex optimization on the MatchNotRegexp matcher type
Browse files Browse the repository at this point in the history
  • Loading branch information
alanprot committed May 18, 2023
1 parent 5289449 commit 2c86371
Showing 1 changed file with 24 additions and 10 deletions.
34 changes: 24 additions & 10 deletions pkg/store/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -2282,28 +2282,30 @@ func checkNilPosting(l labels.Label, p index.Postings) index.Postings {
func toPostingGroup(ctx context.Context, lvalsFn func(name string) ([]string, error), m *labels.Matcher) (*postingGroup, error) {
if m.Type == labels.MatchRegexp {
if vals := findSetMatches(m.Value); len(vals) > 0 {
// Sorting will improve the performance dramatically if the dataset is relatively large
// since entries in the postings offset table was sorted by label name and value,
// the sequential reading is much faster.
sort.Strings(vals)
toAdd := make([]labels.Label, 0, len(vals))
for _, val := range vals {
toAdd = append(toAdd, labels.Label{Name: m.Name, Value: val})
}
return newPostingGroup(false, toAdd, nil), nil
return newPostingGroup(false, labelsFromSetMatchers(m.Name, vals), nil), nil
}
}

// If the matcher selects an empty value, it selects all the series which don't
// have the label name set too. See: https://github.com/prometheus/prometheus/issues/3575
// and https://github.com/prometheus/prometheus/pull/3578#issuecomment-351653555.
if m.Matches("") {
var toRemove []labels.Label

// Inverse of a MatchNotRegexp is MatchRegexp (double negation).
// Fast-path for set matching.
if m.Type == labels.MatchNotRegexp {
if vals := findSetMatches(m.Value); len(vals) > 0 {
toRemove = labelsFromSetMatchers(m.Name, vals)
return newPostingGroup(true, nil, toRemove), nil
}
}

vals, err := lvalsFn(m.Name)
if err != nil {
return nil, err
}

var toRemove []labels.Label
for _, val := range vals {
if ctx.Err() != nil {
return nil, ctx.Err()
Expand Down Expand Up @@ -2339,6 +2341,18 @@ func toPostingGroup(ctx context.Context, lvalsFn func(name string) ([]string, er
return newPostingGroup(false, toAdd, nil), nil
}

func labelsFromSetMatchers(name string, vals []string) []labels.Label {
// Sorting will improve the performance dramatically if the dataset is relatively large
// since entries in the postings offset table was sorted by label name and value,
// the sequential reading is much faster.
sort.Strings(vals)
toAdd := make([]labels.Label, 0, len(vals))
for _, val := range vals {
toAdd = append(toAdd, labels.Label{Name: name, Value: val})
}
return toAdd
}

type postingPtr struct {
keyID int
ptr index.Range
Expand Down

0 comments on commit 2c86371

Please sign in to comment.