summaryrefslogtreecommitdiff
path: root/db/post_migrate
diff options
context:
space:
mode:
Diffstat (limited to 'db/post_migrate')
-rw-r--r--db/post_migrate/20210713042000_fix_ci_sources_pipelines_index_names.rb59
-rw-r--r--db/post_migrate/20211022214523_schedule_recalculate_vulnerability_finding_signatures_for_findings.rb25
-rw-r--r--db/post_migrate/20211023102243_schedule_delete_invalid_epic_issues.rb14
-rw-r--r--db/post_migrate/20211027043206_track_ci_pipeline_deletions.rb15
-rw-r--r--db/post_migrate/20211027043229_track_ci_build_deletions.rb15
-rw-r--r--db/post_migrate/20211101222614_consume_remaining_user_namespace_jobs.rb26
-rw-r--r--db/post_migrate/20211103141403_remove_propagate_service_template_worker.rb11
-rw-r--r--db/post_migrate/20211104165220_remove_vulnerability_finding_links.rb21
-rw-r--r--db/post_migrate/20211110143306_add_not_null_constraint_to_security_findings_uuid.rb20
-rw-r--r--db/post_migrate/20211110151320_add_temporary_index_on_security_findings_uuid.rb23
-rw-r--r--db/post_migrate/20211110151350_schedule_drop_invalid_security_findings.rb25
-rw-r--r--db/post_migrate/20211116091751_change_namespace_type_default_to_user.rb17
-rw-r--r--db/post_migrate/20211116111644_schedule_remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb23
-rw-r--r--db/post_migrate/20211117084814_migrate_remaining_u2f_registrations.rb26
-rw-r--r--db/post_migrate/20211118130836_drop_pages_deployments_builds_fk.rb22
-rw-r--r--db/post_migrate/20211118194239_drop_invalid_remediations.rb25
-rw-r--r--db/post_migrate/20211119085036_add_text_limit_to_job_artifact_original_filename.rb13
-rw-r--r--db/post_migrate/20211122033501_improve_index_on_events_for_calendar.rb13
-rw-r--r--db/post_migrate/20211122193948_cleanup_background_migration_of_requirements_to_work_items.rb17
-rw-r--r--db/post_migrate/20211124132705_change_index_users_on_public_email.rb22
-rw-r--r--db/post_migrate/20211125120444_add_index_todos_project_id_user_id.rb15
-rw-r--r--db/post_migrate/20211130165043_backfill_sequence_column_for_sprints_table.rb24
-rw-r--r--db/post_migrate/20211130201100_track_deletions_in_namespaces.rb15
-rw-r--r--db/post_migrate/20211130201101_track_deletions_in_projects.rb15
-rw-r--r--db/post_migrate/20211201101541_drop_clusters_applications_runners_ci_runners_fk.rb15
-rw-r--r--db/post_migrate/20211202145237_add_todos_project_and_id_index.rb32
-rw-r--r--db/post_migrate/20211203091642_add_index_to_projects_on_marked_for_deletion_at.rb15
-rw-r--r--db/post_migrate/20211206073851_create_calendar_events_index_synchronously.rb15
-rw-r--r--db/post_migrate/20211206074547_remove_old_calendar_events_index.rb18
-rw-r--r--db/post_migrate/20211207090503_cleanup_first_mentioned_in_commit_jobs.rb22
-rw-r--r--db/post_migrate/20211208171402_reschedule_recalculate_vulnerability_finding_signatures_for_findings.rb27
-rw-r--r--db/post_migrate/20211209093636_track_ci_job_artifacts_deletes.rb15
-rw-r--r--db/post_migrate/20211209093828_track_users_deletes.rb15
-rw-r--r--db/post_migrate/20211209093923_track_external_pull_requests_deletes.rb15
-rw-r--r--db/post_migrate/20211209094222_track_merge_requests_deletes.rb15
-rw-r--r--db/post_migrate/20211210173137_remove_vulnerability_finding_links_again.rb21
-rw-r--r--db/post_migrate/20211213064821_add_agent_id_location_index_to_vulnerability_occurrences.rb18
-rw-r--r--db/post_migrate/20211213102111_drop_ci_pipelines_mr_metrics_fk.rb15
-rw-r--r--db/post_migrate/20211215090620_schedule_update_timelogs_null_spent_at.rb23
39 files changed, 782 insertions, 0 deletions
diff --git a/db/post_migrate/20210713042000_fix_ci_sources_pipelines_index_names.rb b/db/post_migrate/20210713042000_fix_ci_sources_pipelines_index_names.rb
new file mode 100644
index 00000000000..34701d8ba46
--- /dev/null
+++ b/db/post_migrate/20210713042000_fix_ci_sources_pipelines_index_names.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+# When the `ci_sources_pipelines` table was first introduced in GitLab
+# 9.3 EE, the foreign key names generate for the table appeared to
+# have been calculated via a hash using the table name
+# `ci_pipeline_source_pipelines`. This led to a merge conflict and
+# confusion during a CE to EE merge in GitLab 10.0, which regenerated
+# the schema with the correct foreign key names.
+#
+# Hence anyone who installed GitLab prior to 10.0 may have been seeded
+# the database with stale, incorrect foreign key names.
+#
+# During the Great BigInt Conversion of 2021, several migrations
+# assumed that the foreign key `fk_be5624bf37` existed for
+# `ci_sources_pipeline`. However, older installations may have had the
+# correct foreign key under the name `fk_3f0c88d7dc`.
+#
+# To eliminate future confusion and migration failures, we now rename
+# the foreign key constraints and index to what they should be today.
+class FixCiSourcesPipelinesIndexNames < ActiveRecord::Migration[6.1]
+ include Gitlab::Database::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ TABLE_NAME = 'ci_sources_pipelines'
+
+ # GitLab 9.5.4: https://gitlab.com/gitlab-org/gitlab/-/blob/v9.5.4-ee/db/schema.rb#L2026-2030
+ # GitLab 10.0: https://gitlab.com/gitlab-org/gitlab/-/blob/v10.0.0-ee/db/schema.rb#L2064-2068
+ OLD_TO_NEW_FOREIGN_KEY_DEFS = {
+ 'fk_3f0c88d7dc' => { table: :ci_builds, column: :source_job_id, name: 'fk_be5624bf37' },
+ 'fk_b8c0fac459' => { table: :ci_pipelines, column: :pipeline_id, name: 'fk_e1bad85861' },
+ 'fk_3a3e3cb83a' => { table: :ci_pipelines, column: :source_pipeline_id, name: 'fk_d4e29af7d7' },
+ 'fk_8868d0f3e4' => { table: :projects, column: :source_project_id, name: 'fk_acd9737679' },
+ 'fk_83b4346e48' => { table: :projects, name: 'fk_1e53c97c0a' }
+ }
+ OLD_INDEX_NAME = 'index_ci_pipeline_source_pipelines_on_source_job_id'
+ NEW_INDEX_NAME = 'index_ci_sources_pipelines_on_source_job_id'
+
+ def up
+ OLD_TO_NEW_FOREIGN_KEY_DEFS.each do |old_name, entry|
+ options = { column: entry[:column], name: old_name }.compact
+
+ if foreign_key_exists?(TABLE_NAME, entry[:table], **options)
+ rename_constraint(TABLE_NAME, old_name, entry[:name])
+ end
+ end
+
+ if index_exists_by_name?(TABLE_NAME, OLD_INDEX_NAME)
+ if index_exists_by_name?(TABLE_NAME, NEW_INDEX_NAME)
+ remove_concurrent_index_by_name(TABLE_NAME, OLD_INDEX_NAME)
+ else
+ rename_index(TABLE_NAME, OLD_INDEX_NAME, NEW_INDEX_NAME)
+ end
+ end
+ end
+
+ # There's no reason to revert this change since it should apply on stale schemas
+ def down; end
+end
diff --git a/db/post_migrate/20211022214523_schedule_recalculate_vulnerability_finding_signatures_for_findings.rb b/db/post_migrate/20211022214523_schedule_recalculate_vulnerability_finding_signatures_for_findings.rb
new file mode 100644
index 00000000000..bccbc4e3209
--- /dev/null
+++ b/db/post_migrate/20211022214523_schedule_recalculate_vulnerability_finding_signatures_for_findings.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class ScheduleRecalculateVulnerabilityFindingSignaturesForFindings < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'RecalculateVulnerabilityFindingSignaturesForFindings'
+ BATCH_SIZE = 1_000
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ def up
+ return unless Gitlab.ee?
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('vulnerability_finding_signatures'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211023102243_schedule_delete_invalid_epic_issues.rb b/db/post_migrate/20211023102243_schedule_delete_invalid_epic_issues.rb
new file mode 100644
index 00000000000..e08ad8d89d1
--- /dev/null
+++ b/db/post_migrate/20211023102243_schedule_delete_invalid_epic_issues.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class ScheduleDeleteInvalidEpicIssues < Gitlab::Database::Migration[1.0]
+ # This is a now a no-op
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/348477
+
+ def up
+ # no-op
+ end
+
+ def down
+ # also no-op
+ end
+end
diff --git a/db/post_migrate/20211027043206_track_ci_pipeline_deletions.rb b/db/post_migrate/20211027043206_track_ci_pipeline_deletions.rb
new file mode 100644
index 00000000000..3836159c2cd
--- /dev/null
+++ b/db/post_migrate/20211027043206_track_ci_pipeline_deletions.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackCiPipelineDeletions < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:ci_pipelines)
+ end
+
+ def down
+ untrack_record_deletions(:ci_pipelines)
+ end
+end
diff --git a/db/post_migrate/20211027043229_track_ci_build_deletions.rb b/db/post_migrate/20211027043229_track_ci_build_deletions.rb
new file mode 100644
index 00000000000..b76d5f3261c
--- /dev/null
+++ b/db/post_migrate/20211027043229_track_ci_build_deletions.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackCiBuildDeletions < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:ci_builds)
+ end
+
+ def down
+ untrack_record_deletions(:ci_builds)
+ end
+end
diff --git a/db/post_migrate/20211101222614_consume_remaining_user_namespace_jobs.rb b/db/post_migrate/20211101222614_consume_remaining_user_namespace_jobs.rb
new file mode 100644
index 00000000000..ded9e717bb1
--- /dev/null
+++ b/db/post_migrate/20211101222614_consume_remaining_user_namespace_jobs.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class ConsumeRemainingUserNamespaceJobs < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'BackfillUserNamespace'
+ BATCH_SIZE = 200
+ DEFAULT_VALUE = 'User'
+
+ disable_ddl_transaction!
+
+ def up
+ Gitlab::BackgroundMigration.steal(MIGRATION)
+
+ # Do a manual update in case we lost BG jobs. The expected record count should be 0 or very low.
+ define_batchable_model('namespaces').where(type: nil).each_batch(of: BATCH_SIZE) do |batch|
+ min, max = batch.pluck('MIN(id), MAX(id)').flatten
+
+ Gitlab::BackgroundMigration::BackfillUserNamespace.new.perform(min, max, :namespaces, :id, BATCH_SIZE, 0)
+ end
+
+ change_column_null :namespaces, :type, false
+ end
+
+ def down
+ change_column_null :namespaces, :type, true
+ end
+end
diff --git a/db/post_migrate/20211103141403_remove_propagate_service_template_worker.rb b/db/post_migrate/20211103141403_remove_propagate_service_template_worker.rb
new file mode 100644
index 00000000000..d949641dbce
--- /dev/null
+++ b/db/post_migrate/20211103141403_remove_propagate_service_template_worker.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class RemovePropagateServiceTemplateWorker < Gitlab::Database::Migration[1.0]
+ def up
+ Sidekiq::Queue.new('propagate_service_template').clear
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211104165220_remove_vulnerability_finding_links.rb b/db/post_migrate/20211104165220_remove_vulnerability_finding_links.rb
new file mode 100644
index 00000000000..fc50aa812a7
--- /dev/null
+++ b/db/post_migrate/20211104165220_remove_vulnerability_finding_links.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class RemoveVulnerabilityFindingLinks < Gitlab::Database::Migration[1.0]
+ BATCH_SIZE = 50_000
+ MIGRATION = 'RemoveVulnerabilityFindingLinks'
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('vulnerability_finding_links'),
+ MIGRATION,
+ 2.minutes,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no ops
+ end
+end
diff --git a/db/post_migrate/20211110143306_add_not_null_constraint_to_security_findings_uuid.rb b/db/post_migrate/20211110143306_add_not_null_constraint_to_security_findings_uuid.rb
new file mode 100644
index 00000000000..bdb8f5cd120
--- /dev/null
+++ b/db/post_migrate/20211110143306_add_not_null_constraint_to_security_findings_uuid.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddNotNullConstraintToSecurityFindingsUuid < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_not_null_constraint(
+ :security_findings,
+ :uuid,
+ validate: false
+ )
+ end
+
+ def down
+ remove_not_null_constraint(
+ :security_findings,
+ :uuid
+ )
+ end
+end
diff --git a/db/post_migrate/20211110151320_add_temporary_index_on_security_findings_uuid.rb b/db/post_migrate/20211110151320_add_temporary_index_on_security_findings_uuid.rb
new file mode 100644
index 00000000000..7bc4af0ec4d
--- /dev/null
+++ b/db/post_migrate/20211110151320_add_temporary_index_on_security_findings_uuid.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class AddTemporaryIndexOnSecurityFindingsUuid < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = "tmp_index_uuid_is_null"
+
+ def up
+ add_concurrent_index(
+ :security_findings,
+ :id,
+ where: "uuid IS NULL",
+ name: INDEX_NAME
+ )
+ end
+
+ def down
+ remove_concurrent_index_by_name(
+ :security_findings,
+ INDEX_NAME
+ )
+ end
+end
diff --git a/db/post_migrate/20211110151350_schedule_drop_invalid_security_findings.rb b/db/post_migrate/20211110151350_schedule_drop_invalid_security_findings.rb
new file mode 100644
index 00000000000..98e7b2a8a15
--- /dev/null
+++ b/db/post_migrate/20211110151350_schedule_drop_invalid_security_findings.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class ScheduleDropInvalidSecurityFindings < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = "DropInvalidSecurityFindings"
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 100_000
+ SUB_BATCH_SIZE = 10_000
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('security_findings').where(uuid: nil),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ other_job_arguments: [SUB_BATCH_SIZE],
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211116091751_change_namespace_type_default_to_user.rb b/db/post_migrate/20211116091751_change_namespace_type_default_to_user.rb
new file mode 100644
index 00000000000..468b26e9eb1
--- /dev/null
+++ b/db/post_migrate/20211116091751_change_namespace_type_default_to_user.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class ChangeNamespaceTypeDefaultToUser < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ change_column_default :namespaces, :type, 'User'
+ end
+ end
+
+ def down
+ with_lock_retries do
+ change_column_default :namespaces, :type, nil
+ end
+ end
+end
diff --git a/db/post_migrate/20211116111644_schedule_remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb b/db/post_migrate/20211116111644_schedule_remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb
new file mode 100644
index 00000000000..0424d32a81e
--- /dev/null
+++ b/db/post_migrate/20211116111644_schedule_remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class ScheduleRemoveOccurrencePipelinesAndDuplicateVulnerabilitiesFindings < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'RemoveOccurrencePipelinesAndDuplicateVulnerabilitiesFindings'
+ DELAY_INTERVAL = 2.minutes.to_i
+ BATCH_SIZE = 10_000
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('vulnerability_occurrences'),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211117084814_migrate_remaining_u2f_registrations.rb b/db/post_migrate/20211117084814_migrate_remaining_u2f_registrations.rb
new file mode 100644
index 00000000000..ae9dba32a4a
--- /dev/null
+++ b/db/post_migrate/20211117084814_migrate_remaining_u2f_registrations.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class MigrateRemainingU2fRegistrations < Gitlab::Database::Migration[1.0]
+ BATCH_SIZE = 100
+
+ disable_ddl_transaction!
+
+ def up
+ # We expect only a few number of records satisfying these conditions.
+ # on gitlab.com database, this number is 70 as on 17th Nov, 2021.
+ define_batchable_model('u2f_registrations')
+ .joins("LEFT JOIN webauthn_registrations ON webauthn_registrations.u2f_registration_id = u2f_registrations.id")
+ .where(webauthn_registrations: { u2f_registration_id: nil })
+ .each_batch(of: BATCH_SIZE) do |batch, index|
+ batch.each do |record|
+ Gitlab::BackgroundMigration::MigrateU2fWebauthn.new.perform(record.id, record.id)
+ rescue StandardError => e
+ Gitlab::ErrorTracking.track_exception(e, u2f_registration_id: record.id)
+ end
+ end
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211118130836_drop_pages_deployments_builds_fk.rb b/db/post_migrate/20211118130836_drop_pages_deployments_builds_fk.rb
new file mode 100644
index 00000000000..5eb532f2a00
--- /dev/null
+++ b/db/post_migrate/20211118130836_drop_pages_deployments_builds_fk.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class DropPagesDeploymentsBuildsFk < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ FK_NAME = 'fk_rails_c3a90cf29b'
+
+ def up
+ remove_foreign_key_if_exists(:pages_deployments, :ci_builds, name: FK_NAME)
+ end
+
+ def down
+ add_concurrent_foreign_key(
+ :pages_deployments,
+ :ci_builds,
+ name: FK_NAME,
+ column: :ci_build_id,
+ target_column: :id,
+ on_delete: :nullify
+ )
+ end
+end
diff --git a/db/post_migrate/20211118194239_drop_invalid_remediations.rb b/db/post_migrate/20211118194239_drop_invalid_remediations.rb
new file mode 100644
index 00000000000..93edde87936
--- /dev/null
+++ b/db/post_migrate/20211118194239_drop_invalid_remediations.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class DropInvalidRemediations < Gitlab::Database::Migration[1.0]
+ BATCH_SIZE = 3_000
+ DELAY_INTERVAL = 3.minutes
+ MIGRATION_NAME = 'DropInvalidRemediations'
+ DAY_PRIOR_TO_BUG_INTRODUCTION = DateTime.new(2021, 8, 1, 0, 0, 0)
+
+ disable_ddl_transaction!
+
+ def up
+ return unless Gitlab.ee?
+
+ relation = Gitlab::BackgroundMigration::DropInvalidRemediations::FindingRemediation.where("created_at > ?", DAY_PRIOR_TO_BUG_INTRODUCTION)
+ queue_background_migration_jobs_by_range_at_intervals(relation,
+ MIGRATION_NAME,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE,
+ track_jobs: true)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211119085036_add_text_limit_to_job_artifact_original_filename.rb b/db/post_migrate/20211119085036_add_text_limit_to_job_artifact_original_filename.rb
new file mode 100644
index 00000000000..3eccbb1b3a4
--- /dev/null
+++ b/db/post_migrate/20211119085036_add_text_limit_to_job_artifact_original_filename.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class AddTextLimitToJobArtifactOriginalFilename < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ add_text_limit :ci_job_artifacts, :original_filename, 512
+ end
+
+ def down
+ remove_text_limit :ci_job_artifacts, :original_filename
+ end
+end
diff --git a/db/post_migrate/20211122033501_improve_index_on_events_for_calendar.rb b/db/post_migrate/20211122033501_improve_index_on_events_for_calendar.rb
new file mode 100644
index 00000000000..517e0f08d6a
--- /dev/null
+++ b/db/post_migrate/20211122033501_improve_index_on_events_for_calendar.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class ImproveIndexOnEventsForCalendar < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_events_author_id_project_id_action_target_type_created_at'
+
+ def up
+ prepare_async_index :events, [:author_id, :project_id, :action, :target_type, :created_at], name: INDEX_NAME
+ end
+
+ def down
+ unprepare_async_index :events, [:author_id, :project_id, :action, :target_type, :created_at], name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211122193948_cleanup_background_migration_of_requirements_to_work_items.rb b/db/post_migrate/20211122193948_cleanup_background_migration_of_requirements_to_work_items.rb
new file mode 100644
index 00000000000..df4867d6ae7
--- /dev/null
+++ b/db/post_migrate/20211122193948_cleanup_background_migration_of_requirements_to_work_items.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class CleanupBackgroundMigrationOfRequirementsToWorkItems < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'MigrateRequirementsToWorkItems'
+
+ disable_ddl_transaction!
+
+ def up
+ finalize_background_migration(MIGRATION)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211124132705_change_index_users_on_public_email.rb b/db/post_migrate/20211124132705_change_index_users_on_public_email.rb
new file mode 100644
index 00000000000..6e74a325033
--- /dev/null
+++ b/db/post_migrate/20211124132705_change_index_users_on_public_email.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class ChangeIndexUsersOnPublicEmail < Gitlab::Database::Migration[1.0]
+ INDEX_NAME = 'index_users_on_public_email'
+ INDEX_EXCLUDING_NULL_NAME = 'index_users_on_public_email_excluding_null_and_empty'
+
+ disable_ddl_transaction!
+
+ def up
+ index_condition = "public_email != '' AND public_email IS NOT NULL"
+
+ add_concurrent_index :users, [:public_email], where: index_condition, name: INDEX_EXCLUDING_NULL_NAME
+ remove_concurrent_index_by_name :users, INDEX_NAME
+ end
+
+ def down
+ index_condition = "public_email != ''"
+
+ add_concurrent_index :users, [:public_email], where: index_condition, name: INDEX_NAME
+ remove_concurrent_index_by_name :users, INDEX_EXCLUDING_NULL_NAME
+ end
+end
diff --git a/db/post_migrate/20211125120444_add_index_todos_project_id_user_id.rb b/db/post_migrate/20211125120444_add_index_todos_project_id_user_id.rb
new file mode 100644
index 00000000000..5cc78fc75c4
--- /dev/null
+++ b/db/post_migrate/20211125120444_add_index_todos_project_id_user_id.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexTodosProjectIdUserId < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_todos_on_project_id_and_user_id_and_id'
+
+ def up
+ add_concurrent_index :todos, [:project_id, :user_id, :id], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :todos, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211130165043_backfill_sequence_column_for_sprints_table.rb b/db/post_migrate/20211130165043_backfill_sequence_column_for_sprints_table.rb
new file mode 100644
index 00000000000..420bfb8bcbc
--- /dev/null
+++ b/db/post_migrate/20211130165043_backfill_sequence_column_for_sprints_table.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+class BackfillSequenceColumnForSprintsTable < Gitlab::Database::Migration[1.0]
+ enable_lock_retries!
+
+ def up
+ execute(
+ <<-SQL
+ UPDATE sprints
+ SET sequence=t.row_number
+ FROM (
+ SELECT id, row_number() OVER (PARTITION BY iterations_cadence_id ORDER BY start_date)
+ FROM sprints as s1
+ WHERE s1.iterations_cadence_id IS NOT NULL
+ ) as t
+ WHERE t.id=sprints.id AND (sprints.sequence IS NULL OR sprints.sequence <> t.row_number)
+ SQL
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211130201100_track_deletions_in_namespaces.rb b/db/post_migrate/20211130201100_track_deletions_in_namespaces.rb
new file mode 100644
index 00000000000..e688e0b467d
--- /dev/null
+++ b/db/post_migrate/20211130201100_track_deletions_in_namespaces.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackDeletionsInNamespaces < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:namespaces)
+ end
+
+ def down
+ untrack_record_deletions(:namespaces)
+ end
+end
diff --git a/db/post_migrate/20211130201101_track_deletions_in_projects.rb b/db/post_migrate/20211130201101_track_deletions_in_projects.rb
new file mode 100644
index 00000000000..dfe7ab4c037
--- /dev/null
+++ b/db/post_migrate/20211130201101_track_deletions_in_projects.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackDeletionsInProjects < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:projects)
+ end
+
+ def down
+ untrack_record_deletions(:projects)
+ end
+end
diff --git a/db/post_migrate/20211201101541_drop_clusters_applications_runners_ci_runners_fk.rb b/db/post_migrate/20211201101541_drop_clusters_applications_runners_ci_runners_fk.rb
new file mode 100644
index 00000000000..9a02f64e350
--- /dev/null
+++ b/db/post_migrate/20211201101541_drop_clusters_applications_runners_ci_runners_fk.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropClustersApplicationsRunnersCiRunnersFk < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:clusters_applications_runners, :ci_runners, name: 'fk_02de2ded36')
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(:clusters_applications_runners, :ci_runners, name: 'fk_02de2ded36', column: :runner_id, target_column: :id, on_delete: 'set null')
+ end
+end
diff --git a/db/post_migrate/20211202145237_add_todos_project_and_id_index.rb b/db/post_migrate/20211202145237_add_todos_project_and_id_index.rb
new file mode 100644
index 00000000000..69f7822c057
--- /dev/null
+++ b/db/post_migrate/20211202145237_add_todos_project_and_id_index.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class AddTodosProjectAndIdIndex < Gitlab::Database::Migration[1.0]
+ # When using the methods "add_concurrent_index" or "remove_concurrent_index"
+ # you must disable the use of transactions
+ # as these methods can not run in an existing transaction.
+ # When using "add_concurrent_index" or "remove_concurrent_index" methods make sure
+ # that either of them is the _only_ method called in the migration,
+ # any other changes should go in a separate migration.
+ # This ensures that upon failure _only_ the index creation or removing fails
+ # and can be retried or reverted easily.
+ #
+ # To disable transactions uncomment the following line and remove these
+ # comments:
+ disable_ddl_transaction!
+
+ NEW_INDEX_NAME = 'index_todos_on_project_id_and_id'
+ OLD_INDEX_NAME = 'index_todos_on_project_id'
+
+ def up
+ add_concurrent_index :todos, [:project_id, :id], name: NEW_INDEX_NAME
+ remove_concurrent_index_by_name :todos, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :todos, :project_id, name: OLD_INDEX_NAME
+ remove_concurrent_index_by_name :todos, NEW_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211203091642_add_index_to_projects_on_marked_for_deletion_at.rb b/db/post_migrate/20211203091642_add_index_to_projects_on_marked_for_deletion_at.rb
new file mode 100644
index 00000000000..56b0df1f393
--- /dev/null
+++ b/db/post_migrate/20211203091642_add_index_to_projects_on_marked_for_deletion_at.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class AddIndexToProjectsOnMarkedForDeletionAt < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_projects_not_aimed_for_deletion'
+
+ def up
+ add_concurrent_index :projects, :id, where: 'marked_for_deletion_at IS NULL', name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index :projects, :id, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211206073851_create_calendar_events_index_synchronously.rb b/db/post_migrate/20211206073851_create_calendar_events_index_synchronously.rb
new file mode 100644
index 00000000000..020dceac004
--- /dev/null
+++ b/db/post_migrate/20211206073851_create_calendar_events_index_synchronously.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class CreateCalendarEventsIndexSynchronously < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_events_author_id_project_id_action_target_type_created_at'
+
+ def up
+ add_concurrent_index :events, [:author_id, :project_id, :action, :target_type, :created_at], name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :events, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211206074547_remove_old_calendar_events_index.rb b/db/post_migrate/20211206074547_remove_old_calendar_events_index.rb
new file mode 100644
index 00000000000..51460a9dc95
--- /dev/null
+++ b/db/post_migrate/20211206074547_remove_old_calendar_events_index.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class RemoveOldCalendarEventsIndex < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ OLD_INDEX_NAME = 'index_events_on_author_id_and_project_id'
+
+ def up
+ remove_concurrent_index_by_name :events, OLD_INDEX_NAME
+ end
+
+ def down
+ add_concurrent_index :events, [:author_id, :project_id], name: OLD_INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211207090503_cleanup_first_mentioned_in_commit_jobs.rb b/db/post_migrate/20211207090503_cleanup_first_mentioned_in_commit_jobs.rb
new file mode 100644
index 00000000000..3788a680fb6
--- /dev/null
+++ b/db/post_migrate/20211207090503_cleanup_first_mentioned_in_commit_jobs.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+class CleanupFirstMentionedInCommitJobs < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ MIGRATION = 'FixFirstMentionedInCommitAt'
+ INDEX_NAME = 'index_issue_metrics_first_mentioned_in_commit'
+
+ def up
+ finalize_background_migration(MIGRATION)
+
+ remove_concurrent_index_by_name :issue_metrics, name: INDEX_NAME
+ end
+
+ def down
+ # Handles reported schema inconsistencies (column with or without timezone)
+ # We did the same in db/post_migrate/20211004110500_add_temporary_index_to_issue_metrics.rb
+ condition = Gitlab::BackgroundMigration::FixFirstMentionedInCommitAt::TmpIssueMetrics
+ .first_mentioned_in_commit_at_condition
+ add_concurrent_index :issue_metrics, :issue_id, where: condition, name: INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211208171402_reschedule_recalculate_vulnerability_finding_signatures_for_findings.rb b/db/post_migrate/20211208171402_reschedule_recalculate_vulnerability_finding_signatures_for_findings.rb
new file mode 100644
index 00000000000..8eee082809b
--- /dev/null
+++ b/db/post_migrate/20211208171402_reschedule_recalculate_vulnerability_finding_signatures_for_findings.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+class RescheduleRecalculateVulnerabilityFindingSignaturesForFindings < Gitlab::Database::Migration[1.0]
+ MIGRATION = 'RecalculateVulnerabilityFindingSignaturesForFindings'
+ BATCH_SIZE = 1_000
+ DELAY_INTERVAL = 2.minutes
+
+ disable_ddl_transaction!
+
+ # Due to production incident previous migration was orphaned and must be rescheduled,
+ # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/72919#note_741188600
+ def up
+ return unless Gitlab.ee?
+
+ delete_queued_jobs(MIGRATION)
+
+ requeue_background_migration_jobs_by_range_at_intervals(
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/post_migrate/20211209093636_track_ci_job_artifacts_deletes.rb b/db/post_migrate/20211209093636_track_ci_job_artifacts_deletes.rb
new file mode 100644
index 00000000000..8c95c76d1fe
--- /dev/null
+++ b/db/post_migrate/20211209093636_track_ci_job_artifacts_deletes.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackCiJobArtifactsDeletes < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:ci_job_artifacts)
+ end
+
+ def down
+ untrack_record_deletions(:ci_job_artifacts)
+ end
+end
diff --git a/db/post_migrate/20211209093828_track_users_deletes.rb b/db/post_migrate/20211209093828_track_users_deletes.rb
new file mode 100644
index 00000000000..e25a8a36cb2
--- /dev/null
+++ b/db/post_migrate/20211209093828_track_users_deletes.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackUsersDeletes < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:users)
+ end
+
+ def down
+ untrack_record_deletions(:users)
+ end
+end
diff --git a/db/post_migrate/20211209093923_track_external_pull_requests_deletes.rb b/db/post_migrate/20211209093923_track_external_pull_requests_deletes.rb
new file mode 100644
index 00000000000..cd8a6baf407
--- /dev/null
+++ b/db/post_migrate/20211209093923_track_external_pull_requests_deletes.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackExternalPullRequestsDeletes < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:external_pull_requests)
+ end
+
+ def down
+ untrack_record_deletions(:external_pull_requests)
+ end
+end
diff --git a/db/post_migrate/20211209094222_track_merge_requests_deletes.rb b/db/post_migrate/20211209094222_track_merge_requests_deletes.rb
new file mode 100644
index 00000000000..51007082e9e
--- /dev/null
+++ b/db/post_migrate/20211209094222_track_merge_requests_deletes.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class TrackMergeRequestsDeletes < Gitlab::Database::Migration[1.0]
+ include Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers
+
+ enable_lock_retries!
+
+ def up
+ track_record_deletions(:merge_requests)
+ end
+
+ def down
+ untrack_record_deletions(:merge_requests)
+ end
+end
diff --git a/db/post_migrate/20211210173137_remove_vulnerability_finding_links_again.rb b/db/post_migrate/20211210173137_remove_vulnerability_finding_links_again.rb
new file mode 100644
index 00000000000..98ac4433193
--- /dev/null
+++ b/db/post_migrate/20211210173137_remove_vulnerability_finding_links_again.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class RemoveVulnerabilityFindingLinksAgain < Gitlab::Database::Migration[1.0]
+ BATCH_SIZE = 50_000
+ MIGRATION = 'RemoveVulnerabilityFindingLinks'
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('vulnerability_finding_links'),
+ MIGRATION,
+ 2.minutes,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no ops
+ end
+end
diff --git a/db/post_migrate/20211213064821_add_agent_id_location_index_to_vulnerability_occurrences.rb b/db/post_migrate/20211213064821_add_agent_id_location_index_to_vulnerability_occurrences.rb
new file mode 100644
index 00000000000..92b5a1b085c
--- /dev/null
+++ b/db/post_migrate/20211213064821_add_agent_id_location_index_to_vulnerability_occurrences.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class AddAgentIdLocationIndexToVulnerabilityOccurrences < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ INDEX_NAME = 'index_vulnerability_occurrences_on_location_agent_id'
+
+ def up
+ add_concurrent_index :vulnerability_occurrences, "(location -> 'agent_id')",
+ using: 'GIN',
+ where: 'report_type = 7',
+ name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerability_occurrences, INDEX_NAME
+ end
+end
diff --git a/db/post_migrate/20211213102111_drop_ci_pipelines_mr_metrics_fk.rb b/db/post_migrate/20211213102111_drop_ci_pipelines_mr_metrics_fk.rb
new file mode 100644
index 00000000000..49f498c911d
--- /dev/null
+++ b/db/post_migrate/20211213102111_drop_ci_pipelines_mr_metrics_fk.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class DropCiPipelinesMrMetricsFk < Gitlab::Database::Migration[1.0]
+ disable_ddl_transaction!
+
+ def up
+ with_lock_retries do
+ remove_foreign_key_if_exists(:merge_request_metrics, :ci_pipelines, name: "fk_rails_33ae169d48")
+ end
+ end
+
+ def down
+ add_concurrent_foreign_key(:merge_request_metrics, :ci_pipelines, name: "fk_rails_33ae169d48", column: :pipeline_id, target_column: :id, on_delete: "cascade")
+ end
+end
diff --git a/db/post_migrate/20211215090620_schedule_update_timelogs_null_spent_at.rb b/db/post_migrate/20211215090620_schedule_update_timelogs_null_spent_at.rb
new file mode 100644
index 00000000000..5876d3f8a9a
--- /dev/null
+++ b/db/post_migrate/20211215090620_schedule_update_timelogs_null_spent_at.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class ScheduleUpdateTimelogsNullSpentAt < Gitlab::Database::Migration[1.0]
+ DOWNTIME = false
+ BATCH_SIZE = 5_000
+ DELAY_INTERVAL = 2.minutes
+ MIGRATION = 'UpdateTimelogsNullSpentAt'
+
+ disable_ddl_transaction!
+
+ def up
+ queue_background_migration_jobs_by_range_at_intervals(
+ define_batchable_model('timelogs').where(spent_at: nil),
+ MIGRATION,
+ DELAY_INTERVAL,
+ batch_size: BATCH_SIZE
+ )
+ end
+
+ def down
+ # no-op
+ end
+end