Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions pkg/configs/db/postgres/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/Masterminds/squirrel"
"github.com/go-kit/kit/log/level"
"github.com/lib/pq"
_ "github.com/lib/pq" // Import the postgres sql driver
_ "github.com/mattes/migrate/driver/postgres" // Import the postgres migrations driver
"github.com/mattes/migrate/migrate"
Expand Down Expand Up @@ -89,7 +90,7 @@ func New(uri, migrationsDir string) (DB, error) {
var statementBuilder = squirrel.StatementBuilder.PlaceholderFormat(squirrel.Dollar).RunWith

func (d DB) findConfigs(filter squirrel.Sqlizer) (map[string]configs.View, error) {
rows, err := d.Select("id", "owner_id", "config").
rows, err := d.Select("id", "owner_id", "config", "deleted_at").
Options("DISTINCT ON (owner_id)").
From("configs").
Where(filter).
Expand All @@ -104,14 +105,16 @@ func (d DB) findConfigs(filter squirrel.Sqlizer) (map[string]configs.View, error
var cfg configs.View
var cfgBytes []byte
var userID string
err = rows.Scan(&cfg.ID, &userID, &cfgBytes)
var deletedAt pq.NullTime
err = rows.Scan(&cfg.ID, &userID, &cfgBytes, &deletedAt)
if err != nil {
return nil, err
}
err = json.Unmarshal(cfgBytes, &cfg.Config)
if err != nil {
return nil, err
}
cfg.DeletedAt = deletedAt.Time
cfgs[userID] = cfg
}
return cfgs, nil
Expand All @@ -121,15 +124,17 @@ func (d DB) findConfigs(filter squirrel.Sqlizer) (map[string]configs.View, error
func (d DB) GetConfig(userID string) (configs.View, error) {
var cfgView configs.View
var cfgBytes []byte
err := d.Select("id", "config").
var deletedAt pq.NullTime
err := d.Select("id", "config", "deleted_at").
From("configs").
Where(squirrel.And{allConfigs, squirrel.Eq{"owner_id": userID}}).
OrderBy("id DESC").
Limit(1).
QueryRow().Scan(&cfgView.ID, &cfgBytes)
QueryRow().Scan(&cfgView.ID, &cfgBytes, &deletedAt)
if err != nil {
return cfgView, err
}
cfgView.DeletedAt = deletedAt.Time
err = json.Unmarshal(cfgBytes, &cfgView.Config)
return cfgView, err
}
Expand Down Expand Up @@ -200,7 +205,7 @@ func (d DB) SetRulesConfig(userID string, oldConfig, newConfig configs.RulesConf
// findRulesConfigs helps GetAllRulesConfigs and GetRulesConfigs retrieve the
// set of all active rules configurations across all our users.
func (d DB) findRulesConfigs(filter squirrel.Sqlizer) (map[string]configs.VersionedRulesConfig, error) {
rows, err := d.Select("id", "owner_id", "config ->> 'rules_files'").
rows, err := d.Select("id", "owner_id", "config ->> 'rules_files'", "deleted_at").
Options("DISTINCT ON (owner_id)").
From("configs").
Where(filter).
Expand All @@ -225,14 +230,16 @@ func (d DB) findRulesConfigs(filter squirrel.Sqlizer) (map[string]configs.Versio
var cfg configs.VersionedRulesConfig
var userID string
var cfgBytes []byte
err = rows.Scan(&cfg.ID, &userID, &cfgBytes)
var deletedAt pq.NullTime
err = rows.Scan(&cfg.ID, &userID, &cfgBytes, &deletedAt)
if err != nil {
return nil, err
}
err = json.Unmarshal(cfgBytes, &cfg.Config)
if err != nil {
return nil, err
}
cfg.DeletedAt = deletedAt.Time
cfgs[userID] = cfg
}
return cfgs, nil
Expand All @@ -254,7 +261,7 @@ func (d DB) GetRulesConfigs(since configs.ID) (map[string]configs.VersionedRules
// SetDeletedAtConfig sets a deletedAt for configuration
// by adding a single new row with deleted_at set
// the same as SetConfig is actually insert
func (d DB) SetDeletedAtConfig(userID string, deletedAt time.Time, cfg configs.Config) error {
func (d DB) SetDeletedAtConfig(userID string, deletedAt pq.NullTime, cfg configs.Config) error {
cfgBytes, err := json.Marshal(cfg)
if err != nil {
return err
Expand All @@ -272,7 +279,7 @@ func (d DB) DeactivateConfig(userID string) error {
if err != nil {
return err
}
return d.SetDeletedAtConfig(userID, time.Now(), cfg.Config)
return d.SetDeletedAtConfig(userID, pq.NullTime{Time: time.Now(), Valid: true}, cfg.Config)
}

// RestoreConfig restores configuration.
Expand All @@ -281,7 +288,7 @@ func (d DB) RestoreConfig(userID string) error {
if err != nil {
return err
}
return d.SetDeletedAtConfig(userID, time.Time{}, cfg.Config)
return d.SetDeletedAtConfig(userID, pq.NullTime{}, cfg.Config)
}

// Transaction runs the given function in a postgres transaction. If fn returns
Expand Down
2 changes: 1 addition & 1 deletion pkg/ruler/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ func (s *scheduler) addNewConfigs(now time.Time, cfgs map[string]configs.Version
}
level.Info(util.Logger).Log("msg", "scheduler: updating rules for user", "user_id", userID, "num_rules", len(rules))
s.Lock()
// if deleted remove from map
// if deleted remove from map, otherwise - update map
if !config.DeletedAt.IsZero() {
delete(s.cfgs, userID)
} else {
Expand Down