Add partitioned copy for sent_notifications table

What does this MR do and why?

Table partitioned monthly starting on a date where we know we have the lowest date as the column didn't exist before then.

  • We are changing how we accesss these records, now we need to fetch by id and created_at to only query one partition
  • In .com we are only going to backfill the table with data from ~2 years ago
  • In self hosted we'll backfill ALL records

Referenced: Backfill partitioned sent_notifications table

Migration output

UP
main: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9544
main: == 20250611150110 CreatePartitionedSentNotifications: migrating ===============
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction(nil)
main: -- transaction(nil)
main: -- execute("CREATE TABLE sent_notifications_7abbf02cb6 (\n  LIKE sent_notifications INCLUDING ALL EXCLUDING INDEXES,\n  partition_key_bfab5f7bb7 timestamp with time zone NOT NULL,\n  PRIMARY KEY (id, partition_key_bfab5f7bb7)\n) PARTITION BY RANGE (partition_key_bfab5f7bb7)\n")
main:    -> 0.0018s
main: -- remove_column("sent_notifications_7abbf02cb6", "created_at")
main:    -> 0.0005s
main: -- rename_column("sent_notifications_7abbf02cb6", "partition_key_bfab5f7bb7", "created_at")
main:    -> 0.0011s
main: -- change_column_default("sent_notifications_7abbf02cb6", "id", nil)
main:    -> 0.0015s
main: -- change_column("sent_notifications_7abbf02cb6", "id", :bigint)
main:    -> 0.0006s
main:    -> 0.0062s
main: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM (MINVALUE) TO ('2025-04-01')\n")
main:    -> 0.0019s
main: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-04-01') TO ('2025-05-01')\n")
main:    -> 0.0012s
main: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-05-01') TO ('2025-06-01')\n")
main:    -> 0.0016s
main: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-06-01') TO ('2025-07-01')\n")
main:    -> 0.0011s
main: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-07-01') TO ('2025-08-01')\n")
main:    -> 0.0013s
main:    -> 0.0155s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("CREATE  FUNCTION table_sync_function_d452a5847a()\nRETURNS TRIGGER AS\n$$\nBEGIN\nIF (TG_OP = 'DELETE') THEN\n  DELETE FROM sent_notifications_7abbf02cb6 where \"id\" = OLD.\"id\";\nELSIF (TG_OP = 'UPDATE') THEN\n  UPDATE sent_notifications_7abbf02cb6\n  SET \"project_id\" = NEW.\"project_id\",\n    \"noteable_id\" = NEW.\"noteable_id\",\n    \"noteable_type\" = NEW.\"noteable_type\",\n    \"recipient_id\" = NEW.\"recipient_id\",\n    \"commit_id\" = NEW.\"commit_id\",\n    \"reply_key\" = NEW.\"reply_key\",\n    \"in_reply_to_discussion_id\" = NEW.\"in_reply_to_discussion_id\",\n    \"issue_email_participant_id\" = NEW.\"issue_email_participant_id\",\n    \"namespace_id\" = NEW.\"namespace_id\",\n    \"created_at\" = NEW.\"created_at\"\n  WHERE sent_notifications_7abbf02cb6.\"id\" = NEW.\"id\";\nELSIF (TG_OP = 'INSERT') THEN\n  INSERT INTO sent_notifications_7abbf02cb6 (\"project_id\",\n    \"noteable_id\",\n    \"noteable_type\",\n    \"recipient_id\",\n    \"commit_id\",\n    \"reply_key\",\n    \"in_reply_to_discussion_id\",\n    \"id\",\n    \"issue_email_participant_id\",\n    \"namespace_id\",\n    \"created_at\")\n  VALUES (NEW.\"project_id\",\n    NEW.\"noteable_id\",\n    NEW.\"noteable_type\",\n    NEW.\"recipient_id\",\n    NEW.\"commit_id\",\n    NEW.\"reply_key\",\n    NEW.\"in_reply_to_discussion_id\",\n    NEW.\"id\",\n    NEW.\"issue_email_participant_id\",\n    NEW.\"namespace_id\",\n    NEW.\"created_at\");\nEND IF;\nRETURN NULL;\n\nEND\n$$ LANGUAGE PLPGSQL\n")
main:    -> 0.0089s
main: -- execute("COMMENT ON FUNCTION table_sync_function_d452a5847a IS 'Partitioning migration: table sync for sent_notifications table'")
main:    -> 0.0004s
main: -- execute("CREATE TRIGGER table_sync_trigger_a747bc4a6e\nAFTER INSERT OR UPDATE OR DELETE ON sent_notifications\nFOR EACH ROW\n\nEXECUTE FUNCTION table_sync_function_d452a5847a()\n")
main:    -> 0.0004s
main: == 20250611150110 CreatePartitionedSentNotifications: migrated (0.0646s) ======

main: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9544
ci: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9545
ci: == 20250611150110 CreatePartitionedSentNotifications: migrating ===============
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction(nil)
ci: -- transaction(nil)
ci: -- execute("CREATE TABLE sent_notifications_7abbf02cb6 (\n  LIKE sent_notifications INCLUDING ALL EXCLUDING INDEXES,\n  partition_key_bfab5f7bb7 timestamp with time zone NOT NULL,\n  PRIMARY KEY (id, partition_key_bfab5f7bb7)\n) PARTITION BY RANGE (partition_key_bfab5f7bb7)\n")
ci:    -> 0.0020s
ci: -- remove_column("sent_notifications_7abbf02cb6", "created_at")
ci:    -> 0.0004s
ci: -- rename_column("sent_notifications_7abbf02cb6", "partition_key_bfab5f7bb7", "created_at")
ci:    -> 0.0013s
ci: -- change_column_default("sent_notifications_7abbf02cb6", "id", nil)
ci:    -> 0.0011s
ci: -- change_column("sent_notifications_7abbf02cb6", "id", :bigint)
ci:    -> 0.0009s
ci:    -> 0.0064s
ci: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM (MINVALUE) TO ('2025-04-01')\n")
ci:    -> 0.0019s
ci: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-04-01') TO ('2025-05-01')\n")
ci:    -> 0.0013s
ci: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-05-01') TO ('2025-06-01')\n")
ci:    -> 0.0012s
ci: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-06-01') TO ('2025-07-01')\n")
ci:    -> 0.0015s
ci: -- execute("CREATE TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507 PARTITION OF sent_notifications_7abbf02cb6\nFOR VALUES FROM ('2025-07-01') TO ('2025-08-01')\n")
ci:    -> 0.0014s
ci:    -> 0.0161s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("CREATE  FUNCTION table_sync_function_d452a5847a()\nRETURNS TRIGGER AS\n$$\nBEGIN\nIF (TG_OP = 'DELETE') THEN\n  DELETE FROM sent_notifications_7abbf02cb6 where \"id\" = OLD.\"id\";\nELSIF (TG_OP = 'UPDATE') THEN\n  UPDATE sent_notifications_7abbf02cb6\n  SET \"project_id\" = NEW.\"project_id\",\n    \"noteable_id\" = NEW.\"noteable_id\",\n    \"noteable_type\" = NEW.\"noteable_type\",\n    \"recipient_id\" = NEW.\"recipient_id\",\n    \"commit_id\" = NEW.\"commit_id\",\n    \"reply_key\" = NEW.\"reply_key\",\n    \"in_reply_to_discussion_id\" = NEW.\"in_reply_to_discussion_id\",\n    \"issue_email_participant_id\" = NEW.\"issue_email_participant_id\",\n    \"namespace_id\" = NEW.\"namespace_id\",\n    \"created_at\" = NEW.\"created_at\"\n  WHERE sent_notifications_7abbf02cb6.\"id\" = NEW.\"id\";\nELSIF (TG_OP = 'INSERT') THEN\n  INSERT INTO sent_notifications_7abbf02cb6 (\"project_id\",\n    \"noteable_id\",\n    \"noteable_type\",\n    \"recipient_id\",\n    \"commit_id\",\n    \"reply_key\",\n    \"in_reply_to_discussion_id\",\n    \"id\",\n    \"issue_email_participant_id\",\n    \"namespace_id\",\n    \"created_at\")\n  VALUES (NEW.\"project_id\",\n    NEW.\"noteable_id\",\n    NEW.\"noteable_type\",\n    NEW.\"recipient_id\",\n    NEW.\"commit_id\",\n    NEW.\"reply_key\",\n    NEW.\"in_reply_to_discussion_id\",\n    NEW.\"id\",\n    NEW.\"issue_email_participant_id\",\n    NEW.\"namespace_id\",\n    NEW.\"created_at\");\nEND IF;\nRETURN NULL;\n\nEND\n$$ LANGUAGE PLPGSQL\n")
ci:    -> 0.0011s
ci: -- execute("COMMENT ON FUNCTION table_sync_function_d452a5847a IS 'Partitioning migration: table sync for sent_notifications table'")
ci:    -> 0.0031s
ci: -- execute("CREATE TRIGGER table_sync_trigger_a747bc4a6e\nAFTER INSERT OR UPDATE OR DELETE ON sent_notifications\nFOR EACH ROW\n\nEXECUTE FUNCTION table_sync_function_d452a5847a()\n")
ci:    -> 0.0004s
I, [2025-06-18T19:37:01.740767 #9524]  INFO -- : Database: 'ci', Table: 'sent_notifications_7abbf02cb6': Lock Writes
I, [2025-06-18T19:37:01.741275 #9524]  INFO -- : {:method=>"with_lock_retries", :class=>"gitlab:db:lock_writes", :message=>"Lock timeout is set", :current_iteration=>1, :lock_timeout_in_ms=>100}
I, [2025-06-18T19:37:01.741579 #9524]  INFO -- : {:method=>"with_lock_retries", :class=>"gitlab:db:lock_writes", :message=>"Migration finished", :current_iteration=>1, :lock_timeout_in_ms=>100}
ci: == 20250611150110 CreatePartitionedSentNotifications: migrated (0.0354s) ======

ci: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9545
main: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9547
main: == 20250611161930 AddPartitionedIndexesToSentNotifications: migrating =========
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_issue_email_participant_id")
main:    -> 0.0007s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :issue_email_participant_id, {:name=>"index_40578c5783", :algorithm=>:concurrently})
main:    -> 0.0009s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0003s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :issue_email_participant_id, {:name=>"index_40578c5783", :algorithm=>:concurrently})
main:    -> 0.0013s
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :issue_email_participant_id, {:name=>"index_ce54154efb", :algorithm=>:concurrently})
main:    -> 0.0006s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :issue_email_participant_id, {:name=>"index_ce54154efb", :algorithm=>:concurrently})
main:    -> 0.0011s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :issue_email_participant_id, {:name=>"index_b5d8642b32", :algorithm=>:concurrently})
main:    -> 0.0006s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :issue_email_participant_id, {:name=>"index_b5d8642b32", :algorithm=>:concurrently})
main:    -> 0.0011s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :issue_email_participant_id, {:name=>"index_86d2eeef11", :algorithm=>:concurrently})
main:    -> 0.0006s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :issue_email_participant_id, {:name=>"index_86d2eeef11", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :issue_email_participant_id, {:name=>"index_a3fba6af13", :algorithm=>:concurrently})
main:    -> 0.0007s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :issue_email_participant_id, {:name=>"index_a3fba6af13", :algorithm=>:concurrently})
main:    -> 0.0011s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- add_index(:sent_notifications_7abbf02cb6, :issue_email_participant_id, {:name=>"idx_p_sent_notifications_on_issue_email_participant_id"})
main:    -> 0.0012s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_namespace_id")
main:    -> 0.0004s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :namespace_id, {:name=>"index_401fa5056c", :algorithm=>:concurrently})
main:    -> 0.0013s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :namespace_id, {:name=>"index_401fa5056c", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :namespace_id, {:name=>"index_055d233ac6", :algorithm=>:concurrently})
main:    -> 0.0008s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :namespace_id, {:name=>"index_055d233ac6", :algorithm=>:concurrently})
main:    -> 0.0011s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :namespace_id, {:name=>"index_59dc18e9c9", :algorithm=>:concurrently})
main:    -> 0.0008s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :namespace_id, {:name=>"index_59dc18e9c9", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :namespace_id, {:name=>"index_bac445a0ad", :algorithm=>:concurrently})
main:    -> 0.0008s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :namespace_id, {:name=>"index_bac445a0ad", :algorithm=>:concurrently})
main:    -> 0.0009s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :namespace_id, {:name=>"index_9404e368e6", :algorithm=>:concurrently})
main:    -> 0.0008s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :namespace_id, {:name=>"index_9404e368e6", :algorithm=>:concurrently})
main:    -> 0.0008s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- add_index(:sent_notifications_7abbf02cb6, :namespace_id, {:name=>"idx_p_sent_notifications_on_namespace_id"})
main:    -> 0.0008s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_noteable_type_noteable_id_and_id")
main:    -> 0.0005s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", [:noteable_id, :id], {:name=>"index_8d57da74a4", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", [:noteable_id, :id], {:name=>"index_8d57da74a4", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0021s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", [:noteable_id, :id], {:name=>"index_fa325a0544", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", [:noteable_id, :id], {:name=>"index_fa325a0544", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0019s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", [:noteable_id, :id], {:name=>"index_7e17ffc913", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", [:noteable_id, :id], {:name=>"index_7e17ffc913", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0020s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", [:noteable_id, :id], {:name=>"index_267bf71cfc", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", [:noteable_id, :id], {:name=>"index_267bf71cfc", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0019s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", [:noteable_id, :id], {:name=>"index_4d9f7ef196", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0010s
main: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", [:noteable_id, :id], {:name=>"index_4d9f7ef196", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
main:    -> 0.0019s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- add_index(:sent_notifications_7abbf02cb6, [:noteable_id, :id], {:name=>"idx_p_sent_notifications_on_noteable_type_noteable_id_and_id", :where=>"noteable_type = 'Issue'"})
main:    -> 0.0016s
main: == 20250611161930 AddPartitionedIndexesToSentNotifications: migrated (0.1034s)

main: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9547
ci: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9552
ci: == 20250611161930 AddPartitionedIndexesToSentNotifications: migrating =========
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_issue_email_participant_id")
ci:    -> 0.0007s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :issue_email_participant_id, {:name=>"index_40578c5783", :algorithm=>:concurrently})
ci:    -> 0.0007s
ci: -- execute("SET statement_timeout TO 0")
ci:    -> 0.0003s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :issue_email_participant_id, {:name=>"index_40578c5783", :algorithm=>:concurrently})
ci:    -> 0.0013s
ci: -- execute("RESET statement_timeout")
ci:    -> 0.0003s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :issue_email_participant_id, {:name=>"index_ce54154efb", :algorithm=>:concurrently})
ci:    -> 0.0007s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :issue_email_participant_id, {:name=>"index_ce54154efb", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :issue_email_participant_id, {:name=>"index_b5d8642b32", :algorithm=>:concurrently})
ci:    -> 0.0006s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :issue_email_participant_id, {:name=>"index_b5d8642b32", :algorithm=>:concurrently})
ci:    -> 0.0011s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :issue_email_participant_id, {:name=>"index_86d2eeef11", :algorithm=>:concurrently})
ci:    -> 0.0007s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :issue_email_participant_id, {:name=>"index_86d2eeef11", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :issue_email_participant_id, {:name=>"index_a3fba6af13", :algorithm=>:concurrently})
ci:    -> 0.0006s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :issue_email_participant_id, {:name=>"index_a3fba6af13", :algorithm=>:concurrently})
ci:    -> 0.0009s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- add_index(:sent_notifications_7abbf02cb6, :issue_email_participant_id, {:name=>"idx_p_sent_notifications_on_issue_email_participant_id"})
ci:    -> 0.0008s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_namespace_id")
ci:    -> 0.0005s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :namespace_id, {:name=>"index_401fa5056c", :algorithm=>:concurrently})
ci:    -> 0.0011s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", :namespace_id, {:name=>"index_401fa5056c", :algorithm=>:concurrently})
ci:    -> 0.0012s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :namespace_id, {:name=>"index_055d233ac6", :algorithm=>:concurrently})
ci:    -> 0.0008s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", :namespace_id, {:name=>"index_055d233ac6", :algorithm=>:concurrently})
ci:    -> 0.0008s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :namespace_id, {:name=>"index_59dc18e9c9", :algorithm=>:concurrently})
ci:    -> 0.0008s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", :namespace_id, {:name=>"index_59dc18e9c9", :algorithm=>:concurrently})
ci:    -> 0.0009s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :namespace_id, {:name=>"index_bac445a0ad", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", :namespace_id, {:name=>"index_bac445a0ad", :algorithm=>:concurrently})
ci:    -> 0.0009s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :namespace_id, {:name=>"index_9404e368e6", :algorithm=>:concurrently})
ci:    -> 0.0012s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", :namespace_id, {:name=>"index_9404e368e6", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- add_index(:sent_notifications_7abbf02cb6, :namespace_id, {:name=>"idx_p_sent_notifications_on_namespace_id"})
ci:    -> 0.0007s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_noteable_type_noteable_id_and_id")
ci:    -> 0.0005s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", [:noteable_id, :id], {:name=>"index_8d57da74a4", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000", [:noteable_id, :id], {:name=>"index_8d57da74a4", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0022s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", [:noteable_id, :id], {:name=>"index_fa325a0544", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504", [:noteable_id, :id], {:name=>"index_fa325a0544", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0021s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", [:noteable_id, :id], {:name=>"index_7e17ffc913", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0011s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505", [:noteable_id, :id], {:name=>"index_7e17ffc913", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0019s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", [:noteable_id, :id], {:name=>"index_267bf71cfc", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506", [:noteable_id, :id], {:name=>"index_267bf71cfc", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0018s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_exists?("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", [:noteable_id, :id], {:name=>"index_4d9f7ef196", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0010s
ci: -- add_index("gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507", [:noteable_id, :id], {:name=>"index_4d9f7ef196", :where=>"noteable_type = 'Issue'", :algorithm=>:concurrently})
ci:    -> 0.0020s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- add_index(:sent_notifications_7abbf02cb6, [:noteable_id, :id], {:name=>"idx_p_sent_notifications_on_noteable_type_noteable_id_and_id", :where=>"noteable_type = 'Issue'"})
ci:    -> 0.0022s
ci: == 20250611161930 AddPartitionedIndexesToSentNotifications: migrated (0.1069s)

ci: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9552
main: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9554
main: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: migrating
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
main:    -> 0.0037s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0003s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
main:    -> 0.0010s
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
main:    -> 0.0005s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
main:    -> 0.0007s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
main:    -> 0.0005s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
main:    -> 0.0007s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
main:    -> 0.0006s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
main:    -> 0.0007s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
main:    -> 0.0009s
main: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
main:    -> 0.0007s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("ALTER TABLE sent_notifications_7abbf02cb6 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE ;")
main:    -> 0.0010s
main: -- execute("ALTER TABLE sent_notifications_7abbf02cb6 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
main:    -> 0.0036s
main: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: migrated (0.0735s)

main: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9554
ci: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9557
ci: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: migrating
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
ci:    -> 0.0009s
ci: -- execute("SET statement_timeout TO 0")
ci:    -> 0.0004s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_000000 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
ci:    -> 0.0010s
ci: -- execute("RESET statement_timeout")
ci:    -> 0.0003s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
ci:    -> 0.0005s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202504 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
ci:    -> 0.0007s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
ci:    -> 0.0005s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202505 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
ci:    -> 0.0006s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
ci:    -> 0.0006s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202506 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
ci:    -> 0.0008s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE NOT VALID;")
ci:    -> 0.0005s
ci: -- execute("ALTER TABLE gitlab_partitions_dynamic.sent_notifications_7abbf02cb6_202507 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
ci:    -> 0.0007s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("ALTER TABLE sent_notifications_7abbf02cb6 ADD CONSTRAINT fk_rails_091ff9020c FOREIGN KEY (issue_email_participant_id) REFERENCES issue_email_participants (id) ON DELETE CASCADE ;")
ci:    -> 0.0011s
ci: -- execute("ALTER TABLE sent_notifications_7abbf02cb6 VALIDATE CONSTRAINT fk_rails_091ff9020c;")
ci:    -> 0.0003s
ci: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: migrated (0.0725s)

ci: == [advisory_lock_connection] object_id: 137560, pg_backend_pid: 9557
DOWN
main: == [advisory_lock_connection] object_id: 137440, pg_backend_pid: 62450
main: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: reverting 
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- remove_foreign_key(:sent_notifications_7abbf02cb6, :issue_email_participants, {:column=>:issue_email_participant_id})
main:    -> 0.0080s
main: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: reverted (0.0717s) 

main: == 20250612141934 AddLooseFkToPartitionedSentNotifications: reverting =========
main: -- execute("DROP TRIGGER IF EXISTS sent_notifications_7abbf02cb6_loose_fk_trigger ON sent_notifications_7abbf02cb6")
main:    -> 0.0032s
main: == 20250612141934 AddLooseFkToPartitionedSentNotifications: reverted (0.0127s) 

main: == 20250611161930 AddPartitionedIndexesToSentNotifications: reverting =========
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_issue_email_participant_id")
main:    -> 0.0035s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- remove_index(:sent_notifications_7abbf02cb6, {:name=>"idx_p_sent_notifications_on_issue_email_participant_id"})
main:    -> 0.0069s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_namespace_id")
main:    -> 0.0010s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- remove_index(:sent_notifications_7abbf02cb6, {:name=>"idx_p_sent_notifications_on_namespace_id"})
main:    -> 0.0016s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_noteable_type_noteable_id_and_id")
main:    -> 0.0011s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- remove_index(:sent_notifications_7abbf02cb6, {:name=>"idx_p_sent_notifications_on_noteable_type_noteable_id_and_id"})
main:    -> 0.0014s
main: == 20250611161930 AddPartitionedIndexesToSentNotifications: reverted (0.0522s) 

main: == [advisory_lock_connection] object_id: 137440, pg_backend_pid: 62450
ci: == [advisory_lock_connection] object_id: 137440, pg_backend_pid: 62473
ci: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: reverting 
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- remove_foreign_key(:sent_notifications_7abbf02cb6, :issue_email_participants, {:column=>:issue_email_participant_id})
ci:    -> 0.0062s
ci: == 20250612143426 AddPartitionedFkToSentNotificationsIssueEmailParticipantId: reverted (0.0398s) 

ci: == 20250612141934 AddLooseFkToPartitionedSentNotifications: reverting =========
ci: -- execute("DROP TRIGGER IF EXISTS sent_notifications_7abbf02cb6_loose_fk_trigger ON sent_notifications_7abbf02cb6")
ci:    -> 0.0037s
ci: == 20250612141934 AddLooseFkToPartitionedSentNotifications: reverted (0.0197s) 

ci: == 20250611161930 AddPartitionedIndexesToSentNotifications: reverting =========
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_issue_email_participant_id")
ci:    -> 0.0032s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- remove_index(:sent_notifications_7abbf02cb6, {:name=>"idx_p_sent_notifications_on_issue_email_participant_id"})
ci:    -> 0.0019s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_namespace_id")
ci:    -> 0.0011s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- remove_index(:sent_notifications_7abbf02cb6, {:name=>"idx_p_sent_notifications_on_namespace_id"})
ci:    -> 0.0019s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- index_name_exists?(:sent_notifications_7abbf02cb6, "idx_p_sent_notifications_on_noteable_type_noteable_id_and_id")
ci:    -> 0.0010s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- remove_index(:sent_notifications_7abbf02cb6, {:name=>"idx_p_sent_notifications_on_noteable_type_noteable_id_and_id"})
ci:    -> 0.0014s
ci: == 20250611161930 AddPartitionedIndexesToSentNotifications: reverted (0.0587s) 

ci: == [advisory_lock_connection] object_id: 137440, pg_backend_pid: 62473

main: == [advisory_lock_connection] object_id: 137420, pg_backend_pid: 63161
main: == 20250611150110 CreatePartitionedSentNotifications: reverting ===============
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- transaction_open?(nil)
main:    -> 0.0000s
main: -- execute("DROP TRIGGER IF EXISTS table_sync_trigger_a747bc4a6e ON sent_notifications")
main:    -> 0.0013s
main: -- execute("DROP FUNCTION IF EXISTS table_sync_function_d452a5847a()")
main:    -> 0.0014s
main: -- drop_table("sent_notifications_7abbf02cb6")
main:    -> 0.0159s
main: == 20250611150110 CreatePartitionedSentNotifications: reverted (0.0426s) ======

main: == [advisory_lock_connection] object_id: 137420, pg_backend_pid: 63161
ci: == [advisory_lock_connection] object_id: 137420, pg_backend_pid: 63179
ci: == 20250611150110 CreatePartitionedSentNotifications: reverting ===============
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- transaction_open?(nil)
ci:    -> 0.0000s
ci: -- execute("DROP TRIGGER IF EXISTS table_sync_trigger_a747bc4a6e ON sent_notifications")
ci:    -> 0.0018s
ci: -- execute("DROP FUNCTION IF EXISTS table_sync_function_d452a5847a()")
ci:    -> 0.0080s
ci: -- drop_table("sent_notifications_7abbf02cb6")
ci:    -> 0.0160s
ci: == 20250611150110 CreatePartitionedSentNotifications: reverted (0.0479s) ======

ci: == [advisory_lock_connection] object_id: 137420, pg_backend_pid: 63179

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Related to #514591 (closed)

Edited by Emma Park

Merge request reports

Loading