diff --git a/db/post_migrate/20250829061951_finalize_merge_request_id_bigint_conversion.rb b/db/post_migrate/20250829061951_finalize_merge_request_id_bigint_conversion.rb new file mode 100644 index 0000000000000000000000000000000000000000..088210d07b33235189042f47bc33eab03f79306f --- /dev/null +++ b/db/post_migrate/20250829061951_finalize_merge_request_id_bigint_conversion.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class FinalizeMergeRequestIdBigintConversion < Gitlab::Database::Migration[2.3] + disable_ddl_transaction! + restrict_gitlab_migration gitlab_schema: :gitlab_main + + milestone '18.4' + + COLUMNS = %i[latest_merge_request_diff_id assignee_id author_id id last_edited_by_id merge_user_id milestone_id + source_project_id target_project_id updated_by_id].freeze + + def up + ensure_backfill_conversion_of_integer_to_bigint_is_finished( + 'merge_requests', + COLUMNS + ) + end + + def down; end +end diff --git a/db/post_migrate/20250829063051_sync_bigint_indexes_creation_on_merge_requests_stage_one.rb b/db/post_migrate/20250829063051_sync_bigint_indexes_creation_on_merge_requests_stage_one.rb new file mode 100644 index 0000000000000000000000000000000000000000..b8310a59e3ea848c8412aad4e2e7a48854c085d6 --- /dev/null +++ b/db/post_migrate/20250829063051_sync_bigint_indexes_creation_on_merge_requests_stage_one.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +class SyncBigintIndexesCreationOnMergeRequestsStageOne < Gitlab::Database::Migration[2.3] + include Gitlab::Database::MigrationHelpers::ConvertToBigint + + disable_ddl_transaction! + milestone '18.4' + + TABLE_NAME = 'merge_requests' + BIGINT_COLUMNS = [ + :assignee_id_convert_to_bigint, + :merge_user_id_convert_to_bigint, + :updated_by_id_convert_to_bigint, + :milestone_id_convert_to_bigint, + :source_project_id_convert_to_bigint + ].freeze + + INDEXES = [ + { + name: 'index_merge_requests_on_assignee_id', + columns: [:assignee_id_convert_to_bigint] + }, + { + name: 'index_merge_requests_on_merge_user_id', + columns: [:merge_user_id_convert_to_bigint], + options: { where: "merge_user_id_convert_to_bigint IS NOT NULL" } + }, + { + name: 'index_merge_requests_on_updated_by_id', + columns: [:updated_by_id_convert_to_bigint], + options: { where: "updated_by_id_convert_to_bigint IS NOT NULL" } + }, + { + name: 'index_merge_requests_on_milestone_id', + columns: [:milestone_id_convert_to_bigint] + }, + { + name: 'idx_merge_requests_on_source_project_and_branch_state_opened', + columns: [:source_project_id_convert_to_bigint, :source_branch], + options: { where: "state_id = 1" } + }, + { + name: 'index_merge_requests_on_source_project_id_and_source_branch', + columns: [:source_project_id_convert_to_bigint, :source_branch] + } + ].freeze + + def up + return if skip_migration? + + # rubocop:disable Migration/PreventIndexCreation -- bigint migration + INDEXES.each do |index| + options = index[:options] || {} + add_concurrent_index TABLE_NAME, index[:columns], name: bigint_index_name(index[:name]), **options + end + # rubocop:enable Migration/PreventIndexCreation + end + + def down + return if skip_migration? + + INDEXES.each do |index| + remove_concurrent_index_by_name TABLE_NAME, bigint_index_name(index[:name]) + end + end + + private + + def skip_migration? + unless conversion_columns_exist? + say "No conversion columns found - migration skipped" + return true + end + + false + end + + def conversion_columns_exist? + BIGINT_COLUMNS.all? { |column| column_exists?(TABLE_NAME, column) } + end +end diff --git a/db/post_migrate/20250829064230_add_bigint_foreign_keys_on_merge_requests_stage_one.rb b/db/post_migrate/20250829064230_add_bigint_foreign_keys_on_merge_requests_stage_one.rb new file mode 100644 index 0000000000000000000000000000000000000000..470c99b6059211ff3622f192541f96e5d02f05cf --- /dev/null +++ b/db/post_migrate/20250829064230_add_bigint_foreign_keys_on_merge_requests_stage_one.rb @@ -0,0 +1,96 @@ +# frozen_string_literal: true + +class AddBigintForeignKeysOnMergeRequestsStageOne < Gitlab::Database::Migration[2.3] + disable_ddl_transaction! + milestone '18.4' + + TABLE_NAME = 'merge_requests' + COLUMNS = %i[assignee_id merge_user_id updated_by_id milestone_id source_project_id].freeze + FOREIGN_KEYS = [ + { + source_table: :merge_requests, + column: :assignee_id_convert_to_bigint, + target_table: :users, + target_column: :id, + on_delete: :nullify, + name: :fk_6149611a04 + }, + { + source_table: :merge_requests, + column: :updated_by_id_convert_to_bigint, + target_table: :users, + target_column: :id, + on_delete: :nullify, + name: :fk_641731faff + }, + { + source_table: :merge_requests, + column: :milestone_id_convert_to_bigint, + target_table: :milestones, + target_column: :id, + on_delete: :nullify, + name: :fk_6a5165a692 + }, + { + source_table: :merge_requests, + column: :merge_user_id_convert_to_bigint, + target_table: :users, + target_column: :id, + on_delete: :nullify, + name: :fk_ad525e1f87 + }, + { + source_table: :merge_requests, + column: :source_project_id_convert_to_bigint, + target_table: :projects, + target_column: :id, + on_delete: :nullify, + name: :fk_source_project + } + ].freeze + + def up + conversion_needed = COLUMNS.all? do |column| + column_exists?(TABLE_NAME, convert_to_bigint_column(column)) + end + + unless conversion_needed + say "No conversion columns found - no need to create bigint FKs" + return + end + + FOREIGN_KEYS.each do |fk| + add_concurrent_foreign_key( + fk[:source_table], + fk[:target_table], + column: fk[:column], + target_column: fk[:target_column], + name: tmp_name(fk[:name]), + on_delete: fk[:on_delete], + validate: false, + reverse_lock_order: true + ) + + prepare_async_foreign_key_validation fk[:source_table], fk[:column], name: tmp_name(fk[:name]) + end + end + + def down + FOREIGN_KEYS.each do |fk| + remove_foreign_key_if_exists( + fk[:source_table], + fk[:target_table], + name: tmp_name(fk[:name]), + reverse_lock_order: true + ) + + unprepare_async_foreign_key_validation fk[:source_table], fk[:column], name: tmp_name(fk[:name]) + end + end + + private + + def tmp_name(name) + "#{name}_tmp" + end +end diff --git a/db/schema_migrations/20250829061951 b/db/schema_migrations/20250829061951 new file mode 100644 index 0000000000000000000000000000000000000000..ca70f28c9dbb86a6405d740426f726c8f2811726 --- /dev/null +++ b/db/schema_migrations/20250829061951 @@ -0,0 +1 @@ +256e3a86bb6c122799d7e536bff4c968bb1b82a9b06de1926c84a080c496adf0 \ No newline at end of file diff --git a/db/schema_migrations/20250829063051 b/db/schema_migrations/20250829063051 new file mode 100644 index 0000000000000000000000000000000000000000..63bd86d1fef1777ad3dabc49a62e55f76fff78fd --- /dev/null +++ b/db/schema_migrations/20250829063051 @@ -0,0 +1 @@ +34a13029f9c035dce82729fdbb2b9599ce011991769e4d232e42c8b2efb29881 \ No newline at end of file diff --git a/db/schema_migrations/20250829064230 b/db/schema_migrations/20250829064230 new file mode 100644 index 0000000000000000000000000000000000000000..d5fc3b8cfbfbcb20df065f85c4a39b7b07d7fa3d --- /dev/null +++ b/db/schema_migrations/20250829064230 @@ -0,0 +1 @@ +59faeadec58fc5f9c58e7dc6800eeec2e802b37f05f6e96663438b0b55ee86eb \ No newline at end of file