Skip to content

Commit 82f7ace

Browse files
osmonteroclaude
andcommitted
fix(config): detect filter and rule deletions by tracking active row counts
hasChanges only checked MAX(timestamp) increases, missing deletions where the timestamp didn't advance. Now also compares COUNT of active rows so deactivations and hard deletes trigger config file regeneration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 007d5b5 commit 82f7ace

1 file changed

Lines changed: 23 additions & 10 deletions

File tree

plugins/config/main.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,13 @@ type ExpressionBackend struct {
7575

7676
type ConfigState struct {
7777
AssetsLastUpdate time.Time
78+
AssetsCount int
7879
RulesLastUpdate time.Time
80+
RulesCount int
7981
FiltersLastUpdate time.Time
82+
FiltersCount int
8083
PatternsLastUpdate time.Time
84+
PatternsCount int
8185
}
8286

8387
func (b *ExpressionBackend) ToExpression() Expression {
@@ -431,26 +435,35 @@ func hasChanges(db *sql.DB, state *ConfigState) (bool, ConfigState, error) {
431435
changed := false
432436

433437
queries := []struct {
434-
query string
435-
target *time.Time
436-
old time.Time
438+
timestampQuery string
439+
countQuery string
440+
targetTime *time.Time
441+
targetCount *int
442+
oldTime time.Time
443+
oldCount int
437444
}{
438-
{"SELECT MAX(last_update) FROM utm_tenant_config", &newState.AssetsLastUpdate, state.AssetsLastUpdate},
439-
{"SELECT MAX(rule_last_update) FROM utm_correlation_rules", &newState.RulesLastUpdate, state.RulesLastUpdate},
440-
{"SELECT MAX(updated_at) FROM utm_logstash_filter", &newState.FiltersLastUpdate, state.FiltersLastUpdate},
441-
{"SELECT MAX(last_update) FROM utm_regex_pattern", &newState.PatternsLastUpdate, state.PatternsLastUpdate},
445+
{"SELECT MAX(last_update) FROM utm_tenant_config", "SELECT COUNT(*) FROM utm_tenant_config", &newState.AssetsLastUpdate, &newState.AssetsCount, state.AssetsLastUpdate, state.AssetsCount},
446+
{"SELECT MAX(rule_last_update) FROM utm_correlation_rules", "SELECT COUNT(*) FROM utm_correlation_rules WHERE rule_active = true", &newState.RulesLastUpdate, &newState.RulesCount, state.RulesLastUpdate, state.RulesCount},
447+
{"SELECT MAX(updated_at) FROM utm_logstash_filter", "SELECT COUNT(*) FROM utm_logstash_filter WHERE is_active = true", &newState.FiltersLastUpdate, &newState.FiltersCount, state.FiltersLastUpdate, state.FiltersCount},
448+
{"SELECT MAX(last_update) FROM utm_regex_pattern", "SELECT COUNT(*) FROM utm_regex_pattern", &newState.PatternsLastUpdate, &newState.PatternsCount, state.PatternsLastUpdate, state.PatternsCount},
442449
}
443450

444451
for _, q := range queries {
445452
var lastUpdate sql.NullTime
446-
err := db.QueryRow(q.query).Scan(&lastUpdate)
453+
err := db.QueryRow(q.timestampQuery).Scan(&lastUpdate)
447454
if err != nil {
448455
return false, newState, err
449456
}
450457
if lastUpdate.Valid {
451-
*q.target = lastUpdate.Time
458+
*q.targetTime = lastUpdate.Time
452459
}
453-
if (*q.target).After(q.old) {
460+
461+
err = db.QueryRow(q.countQuery).Scan(q.targetCount)
462+
if err != nil {
463+
return false, newState, err
464+
}
465+
466+
if (*q.targetTime).After(q.oldTime) || *q.targetCount != q.oldCount {
454467
changed = true
455468
}
456469
}

0 commit comments

Comments
 (0)