Skip to content

Commit ba51288

Browse files
authored
Added option to ignore regexp-matching users by scheduler. (#3477)
* Added option to ignore regexp-matching users by scheduler. Signed-off-by: Peter Štibraný <[email protected]> * CHANGELOG.md Signed-off-by: Peter Štibraný <[email protected]> * Fix config. Signed-off-by: Peter Štibraný <[email protected]> * Remove check if allowed users are set, when processing ignored user pattern. User check logic is unchanged ... if user is not allowed, it is skipped. If user is allowed, but ignored, it is skipped. Signed-off-by: Peter Štibraný <[email protected]>
1 parent c1f0eb1 commit ba51288

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
* [BUGFIX] Blocks storage: Fix the race between ingestion and `/flush` call resulting in overlapping blocks. #3422
2121
* [BUGFIX] Querier: fixed `-querier.max-query-into-future` which wasn't correctly enforced on range queries. #3452
2222

23+
## Blocksconvert
24+
25+
* [ENHANCEMENT] Scheduler: ability to ignore users based on regexp, using `-scheduler.ignore-users-regex` flag. #3477
26+
2327
## 1.5.0 / 2020-11-09
2428

2529
### Cortex

tools/blocksconvert/scanner/scanner.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
5656
f.BoolVar(&cfg.KeepFiles, "scanner.keep-files", false, "Keep plan files locally after uploading.")
5757
f.IntVar(&cfg.TablesLimit, "scanner.tables-limit", 0, "Number of tables to convert. 0 = all.")
5858
f.StringVar(&cfg.AllowedUsers, "scanner.allowed-users", "", "Allowed users that can be converted, comma-separated. If set, only these users have plan files generated.")
59-
f.StringVar(&cfg.IgnoredUserPattern, "scanner.ignore-users-regex", "", "If set and user ID matches this regex pattern, it will be ignored. Only used if all -scanner.allowed-users is not set (i.e. all users are allowed by default).")
59+
f.StringVar(&cfg.IgnoredUserPattern, "scanner.ignore-users-regex", "", "If set and user ID matches this regex pattern, it will be ignored. Checked after applying -scanner.allowed-users, if set.")
6060
f.BoolVar(&cfg.VerifyPlans, "scanner.verify-plans", true, "Verify plans before uploading to bucket. Enabled by default for extra check. Requires extra memory for large plans.")
6161
f.Var(&cfg.PeriodStart, "scanner.scan-period-start", "If specified, this is lower end of time period to scan. Specified date is included in the range. (format: \"2006-01-02\")")
6262
f.Var(&cfg.PeriodEnd, "scanner.scan-period-end", "If specified, this is upper end of time period to scan. Specified date is not included in the range. (format: \"2006-01-02\")")
@@ -115,7 +115,7 @@ func NewScanner(cfg Config, scfg blocksconvert.SharedConfig, l log.Logger, reg p
115115
}
116116

117117
var ignoredUserRegex *regexp.Regexp = nil
118-
if users.AllUsersAllowed() && cfg.IgnoredUserPattern != "" {
118+
if cfg.IgnoredUserPattern != "" {
119119
re, err := regexp.Compile(cfg.IgnoredUserPattern)
120120
if err != nil {
121121
return nil, errors.Wrap(err, "failed to compile ignored user regex")

tools/blocksconvert/scheduler/scheduler.go

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"html/template"
77
"net/http"
88
"path"
9+
"regexp"
910
"sort"
1011
"strconv"
1112
"strings"
@@ -31,13 +32,15 @@ type Config struct {
3132
PlanScanConcurrency int
3233
MaxProgressFileAge time.Duration
3334
AllowedUsers string
35+
IgnoredUserPattern string
3436
}
3537

3638
func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
3739
f.DurationVar(&cfg.ScanInterval, "scheduler.scan-interval", 5*time.Minute, "How often to scan for plans and their status.")
3840
f.IntVar(&cfg.PlanScanConcurrency, "scheduler.plan-scan-concurrency", 5, "Limit of concurrent plan scans.")
3941
f.DurationVar(&cfg.MaxProgressFileAge, "scheduler.max-progress-file-age", 30*time.Minute, "Progress files older than this duration are deleted.")
4042
f.StringVar(&cfg.AllowedUsers, "scheduler.allowed-users", "", "Allowed users that can be converted, comma-separated")
43+
f.StringVar(&cfg.IgnoredUserPattern, "scheduler.ignore-users-regex", "", "If set and user ID matches this regex pattern, it will be ignored. Checked after applying -scheduler.allowed-users, if set.")
4144
}
4245

4346
func NewScheduler(cfg Config, scfg blocksconvert.SharedConfig, l log.Logger, reg prometheus.Registerer, http *mux.Router, grpcServ *grpc.Server) (*Scheduler, error) {
@@ -51,19 +54,29 @@ func NewScheduler(cfg Config, scfg blocksconvert.SharedConfig, l log.Logger, reg
5154
users = blocksconvert.ParseAllowedUsers(cfg.AllowedUsers)
5255
}
5356

54-
s := newSchedulerWithBucket(l, b, scfg.BucketPrefix, users, cfg, reg)
57+
var ignoredUserRegex *regexp.Regexp = nil
58+
if cfg.IgnoredUserPattern != "" {
59+
re, err := regexp.Compile(cfg.IgnoredUserPattern)
60+
if err != nil {
61+
return nil, errors.Wrap(err, "failed to compile ignored user regex")
62+
}
63+
ignoredUserRegex = re
64+
}
65+
66+
s := newSchedulerWithBucket(l, b, scfg.BucketPrefix, users, ignoredUserRegex, cfg, reg)
5567
blocksconvert.RegisterSchedulerServer(grpcServ, s)
5668
http.HandleFunc("/plans", s.httpPlans)
5769
return s, nil
5870
}
5971

60-
func newSchedulerWithBucket(l log.Logger, b objstore.Bucket, bucketPrefix string, users blocksconvert.AllowedUsers, cfg Config, reg prometheus.Registerer) *Scheduler {
72+
func newSchedulerWithBucket(l log.Logger, b objstore.Bucket, bucketPrefix string, users blocksconvert.AllowedUsers, ignoredUsers *regexp.Regexp, cfg Config, reg prometheus.Registerer) *Scheduler {
6173
s := &Scheduler{
6274
log: l,
6375
cfg: cfg,
6476
bucket: b,
6577
bucketPrefix: bucketPrefix,
6678
allowedUsers: users,
79+
ignoredUsers: ignoredUsers,
6780

6881
planStatus: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{
6982
Name: "cortex_blocksconvert_scheduler_scanned_plans",
@@ -93,6 +106,7 @@ type Scheduler struct {
93106
log log.Logger
94107

95108
allowedUsers blocksconvert.AllowedUsers
109+
ignoredUsers *regexp.Regexp // Can be nil.
96110

97111
bucket objstore.Bucket
98112
bucketPrefix string
@@ -141,6 +155,7 @@ func (s *Scheduler) scanBucketForPlans(ctx context.Context) error {
141155

142156
allUsers := len(users)
143157
users = s.allowedUsers.GetAllowedUsers(users)
158+
users = s.ignoreUsers(users)
144159

145160
level.Info(s.log).Log("msg", "found users", "all", allUsers, "allowed", len(users))
146161

@@ -477,3 +492,17 @@ func (s *Scheduler) updateQueuedPlansMetrics() {
477492
s.newestPlanTimestamp.Set(0)
478493
}
479494
}
495+
496+
func (s *Scheduler) ignoreUsers(users []string) []string {
497+
if s.ignoredUsers == nil {
498+
return users
499+
}
500+
501+
result := make([]string, 0, len(users))
502+
for _, u := range users {
503+
if !s.ignoredUsers.MatchString(u) {
504+
result = append(result, u)
505+
}
506+
}
507+
return result
508+
}

tools/blocksconvert/scheduler/scheduler_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"os"
7+
"regexp"
78
"strings"
89
"testing"
910
"time"
@@ -89,7 +90,11 @@ func TestSchedulerScan(t *testing.T) {
8990
require.NoError(t, bucket.Upload(context.Background(), "migration/user4/5.error", strings.NewReader("")))
9091
require.NoError(t, bucket.Upload(context.Background(), "migration/user4/6.finished.01E8GCW9J0HV0992HSZ0N6RAMN", strings.NewReader("")))
9192

92-
s := newSchedulerWithBucket(log.NewLogfmtLogger(os.Stdout), bucket, "migration", blocksconvert.AllowAllUsers, Config{
93+
require.NoError(t, bucket.Upload(context.Background(), "migration/ignoredUser/7.plan", strings.NewReader("")))
94+
95+
ignoredUsers := regexp.MustCompile("ignored.*")
96+
97+
s := newSchedulerWithBucket(log.NewLogfmtLogger(os.Stdout), bucket, "migration", blocksconvert.AllowAllUsers, ignoredUsers, Config{
9398
ScanInterval: 10 * time.Second,
9499
PlanScanConcurrency: 5,
95100
MaxProgressFileAge: 5 * time.Minute,

0 commit comments

Comments
 (0)