From 6e1b530d0c356d2fb0f4d0358abd5b644fd341b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Dugovi=C4=8D?= Date: Thu, 17 Sep 2026 12:47:39 +0200 Subject: [PATCH 1/2] RHINENG-29746: backport notified --- .../168_backport_advisories_notified.down.sql | 7 +++++++ .../168_backport_advisories_notified.up.sql | 16 ++++++++++++++++ database_admin/schema/create_schema.sql | 11 ++++++++++- evaluator/notifications.go | 7 +++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 database_admin/migrations/168_backport_advisories_notified.down.sql create mode 100644 database_admin/migrations/168_backport_advisories_notified.up.sql diff --git a/database_admin/migrations/168_backport_advisories_notified.down.sql b/database_admin/migrations/168_backport_advisories_notified.down.sql new file mode 100644 index 000000000..4aa50b983 --- /dev/null +++ b/database_admin/migrations/168_backport_advisories_notified.down.sql @@ -0,0 +1,7 @@ +CREATE OR REPLACE FUNCTION backfill_account_advisory(rh_account_id_in INTEGER) + RETURNS VOID AS +$backfill$ +BEGIN + PERFORM refresh_account_advisory_caches_multi(NULL, rh_account_id_in); +END; +$backfill$ LANGUAGE plpgsql; \ No newline at end of file diff --git a/database_admin/migrations/168_backport_advisories_notified.up.sql b/database_admin/migrations/168_backport_advisories_notified.up.sql new file mode 100644 index 000000000..1e44e1470 --- /dev/null +++ b/database_admin/migrations/168_backport_advisories_notified.up.sql @@ -0,0 +1,16 @@ +CREATE OR REPLACE FUNCTION backfill_account_advisory(rh_account_id_in INTEGER) + RETURNS VOID AS +$backfill$ +BEGIN + PERFORM refresh_account_advisory_caches_multi(NULL, rh_account_id_in); + + -- copy `notified` for all `workspace_id`s per account + UPDATE account_advisory aa + SET notified = aad.notified + FROM advisory_account_data aad + WHERE aa.advisory_id = aad.advisory_id + AND aa.rh_account_id = aad.rh_account_id + AND aa.rh_account_id = rh_account_id_in + AND aad.notified IS NOT NULL; +END; +$backfill$ LANGUAGE plpgsql; diff --git a/database_admin/schema/create_schema.sql b/database_admin/schema/create_schema.sql index 8486330f0..1460a29b8 100644 --- a/database_admin/schema/create_schema.sql +++ b/database_admin/schema/create_schema.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS schema_migrations INSERT INTO schema_migrations -VALUES (167, false); +VALUES (168, false); -- --------------------------------------------------------------------------- -- Functions @@ -229,6 +229,15 @@ CREATE OR REPLACE FUNCTION backfill_account_advisory(rh_account_id_in INTEGER) $backfill$ BEGIN PERFORM refresh_account_advisory_caches_multi(NULL, rh_account_id_in); + + -- copy `notified` for all `workspace_id`s per account + UPDATE account_advisory aa + SET notified = aad.notified + FROM advisory_account_data aad + WHERE aa.advisory_id = aad.advisory_id + AND aa.rh_account_id = aad.rh_account_id + AND aa.rh_account_id = rh_account_id_in + AND aad.notified IS NOT NULL; END; $backfill$ LANGUAGE plpgsql; diff --git a/evaluator/notifications.go b/evaluator/notifications.go index 4cb87a71d..2791c9b0a 100644 --- a/evaluator/notifications.go +++ b/evaluator/notifications.go @@ -76,6 +76,13 @@ func markAdvisoriesNotified(tx *gorm.DB, accountID int, advisoryIDs []int64) err if err != nil { return errors.Wrap(err, "updating notified column failed") } + // Ensure notifications are in sync between aad and aa, while we transition + err = tx.Table("account_advisory"). + Where("rh_account_id = ? AND advisory_id IN (?)", accountID, advisoryIDs). + Update("notified", time.Now()).Error + if err != nil { + return errors.Wrap(err, "updating notified column in account_advisory failed") + } return nil } From 5c91d6fa206add9413940d25d75aa277c7b8b677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Dugovi=C4=8D?= Date: Thu, 17 Sep 2026 13:03:33 +0200 Subject: [PATCH 2/2] RHINENG-29746: add triggers to handle new workspace Co-authored-by: Claude --- .../168_backport_advisories_notified.down.sql | 9 +++++++- .../168_backport_advisories_notified.up.sql | 21 ++++++++++++++++++ database_admin/schema/create_schema.sql | 22 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/database_admin/migrations/168_backport_advisories_notified.down.sql b/database_admin/migrations/168_backport_advisories_notified.down.sql index 4aa50b983..343c5443a 100644 --- a/database_admin/migrations/168_backport_advisories_notified.down.sql +++ b/database_admin/migrations/168_backport_advisories_notified.down.sql @@ -4,4 +4,11 @@ $backfill$ BEGIN PERFORM refresh_account_advisory_caches_multi(NULL, rh_account_id_in); END; -$backfill$ LANGUAGE plpgsql; \ No newline at end of file +$backfill$ LANGUAGE plpgsql; + +SELECT drop_table_partition_triggers('account_advisory_sync_notified_insert', + $$BEFORE INSERT$$, + 'account_advisory', + $$FOR EACH ROW EXECUTE PROCEDURE sync_account_advisory_notified_on_insert()$$); + +DROP FUNCTION IF EXISTS sync_account_advisory_notified_on_insert(); diff --git a/database_admin/migrations/168_backport_advisories_notified.up.sql b/database_admin/migrations/168_backport_advisories_notified.up.sql index 1e44e1470..df920713a 100644 --- a/database_admin/migrations/168_backport_advisories_notified.up.sql +++ b/database_admin/migrations/168_backport_advisories_notified.up.sql @@ -14,3 +14,24 @@ BEGIN AND aad.notified IS NOT NULL; END; $backfill$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION sync_account_advisory_notified_on_insert() + RETURNS TRIGGER AS +$sync_notified_insert$ +BEGIN + IF NEW.notified IS NULL THEN + SELECT notified INTO NEW.notified + FROM account_advisory + WHERE rh_account_id = NEW.rh_account_id + AND advisory_id = NEW.advisory_id + AND notified IS NOT NULL + LIMIT 1; + END IF; + RETURN NEW; +END; +$sync_notified_insert$ LANGUAGE plpgsql; + +SELECT create_table_partition_triggers('account_advisory_sync_notified_insert', + $$BEFORE INSERT$$, + 'account_advisory', + $$FOR EACH ROW EXECUTE PROCEDURE sync_account_advisory_notified_on_insert()$$); diff --git a/database_admin/schema/create_schema.sql b/database_admin/schema/create_schema.sql index 1460a29b8..0f1eb8f9f 100644 --- a/database_admin/schema/create_schema.sql +++ b/database_admin/schema/create_schema.sql @@ -241,6 +241,23 @@ BEGIN END; $backfill$ LANGUAGE plpgsql; +-- handle a new workspace with already notified advisory +CREATE OR REPLACE FUNCTION sync_account_advisory_notified_on_insert() + RETURNS TRIGGER AS +$sync_notified_insert$ +BEGIN + IF NEW.notified IS NULL THEN + SELECT notified INTO NEW.notified + FROM account_advisory + WHERE rh_account_id = NEW.rh_account_id + AND advisory_id = NEW.advisory_id + AND notified IS NOT NULL + LIMIT 1; + END IF; + RETURN NEW; +END; +$sync_notified_insert$ LANGUAGE plpgsql; + CREATE OR REPLACE FUNCTION refresh_system_caches(system_id_in BIGINT DEFAULT NULL, rh_account_id_in INTEGER DEFAULT NULL) RETURNS INTEGER AS @@ -910,6 +927,11 @@ SELECT grant_table_partitions('SELECT, INSERT, UPDATE, DELETE', 'account_advisor SELECT grant_table_partitions('SELECT, INSERT, UPDATE, DELETE', 'account_advisory', 'listener'); SELECT grant_table_partitions('SELECT, INSERT, UPDATE, DELETE', 'account_advisory', 'vmaas_sync'); +SELECT create_table_partition_triggers('account_advisory_sync_notified_insert', + $$BEFORE INSERT$$, + 'account_advisory', + $$FOR EACH ROW EXECUTE PROCEDURE sync_account_advisory_notified_on_insert()$$); + CREATE INDEX ON account_advisory (systems_applicable); CREATE INDEX ON account_advisory (systems_installable); CREATE INDEX ON account_advisory (advisory_id);