diff options
Diffstat (limited to 'db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb')
-rw-r--r-- | db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb b/db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb new file mode 100644 index 00000000000..cb5a5c96b3c --- /dev/null +++ b/db/post_migrate/20230627115305_replace_p_ci_builds_metadata_foreign_key_v4.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +class ReplacePCiBuildsMetadataForeignKeyV4 < Gitlab::Database::Migration[2.1] + include Gitlab::Database::MigrationHelpers::WraparoundAutovacuum + + disable_ddl_transaction! + + def up + return unless should_run? + return if foreign_key_exists?(:p_ci_builds_metadata, :p_ci_builds, name: :temp_fk_e20479742e_p) + + with_lock_retries do + execute(<<~SQL.squish) + LOCK TABLE ci_builds, p_ci_builds, p_ci_builds_metadata IN ACCESS EXCLUSIVE MODE; + + ALTER TABLE p_ci_builds_metadata + ADD CONSTRAINT temp_fk_e20479742e_p + FOREIGN KEY (partition_id, build_id) + REFERENCES p_ci_builds (partition_id, id) + ON UPDATE CASCADE ON DELETE CASCADE; + SQL + end + end + + def down + return unless should_run? + + with_lock_retries do + remove_foreign_key_if_exists :p_ci_builds_metadata, :p_ci_builds, + name: :temp_fk_e20479742e_p, + reverse_lock_order: true + end + end + + private + + def should_run? + can_execute_on?(:ci_builds_metadata, :ci_builds) + end +end |