45 lines
1.6 KiB
Ruby
45 lines
1.6 KiB
Ruby
class MigrateRemainingMrMetricsPopulatingBackgroundMigration < ActiveRecord::Migration[4.2]
|
|
include Gitlab::Database::MigrationHelpers
|
|
|
|
DOWNTIME = false
|
|
BATCH_SIZE = 5_000
|
|
MIGRATION = 'PopulateMergeRequestMetricsWithEventsData'
|
|
DELAY_INTERVAL = 10.minutes
|
|
|
|
disable_ddl_transaction!
|
|
|
|
class MergeRequest < ActiveRecord::Base
|
|
self.table_name = 'merge_requests'
|
|
|
|
include ::EachBatch
|
|
end
|
|
|
|
def up
|
|
# Perform any ongoing background migration that might still be running. This
|
|
# avoids scheduling way too many of the same jobs on self-hosted instances
|
|
# if they're updating GitLab across multiple versions. The "Take one"
|
|
# migration was executed on 10.4 on
|
|
# SchedulePopulateMergeRequestMetricsWithEventsData.
|
|
Gitlab::BackgroundMigration.steal(MIGRATION)
|
|
|
|
metrics_not_exists_clause = <<~SQL
|
|
NOT EXISTS (SELECT 1 FROM merge_request_metrics
|
|
WHERE merge_request_metrics.merge_request_id = merge_requests.id)
|
|
SQL
|
|
|
|
relation = MergeRequest.where(metrics_not_exists_clause)
|
|
|
|
# We currently have ~400_000 MR records without metrics on GitLab.com.
|
|
# This means it'll schedule ~80 jobs (5000 MRs each) with a 10 minutes gap,
|
|
# so this should take ~14 hours for all background migrations to complete.
|
|
#
|
|
queue_background_migration_jobs_by_range_at_intervals(relation,
|
|
MIGRATION,
|
|
DELAY_INTERVAL,
|
|
batch_size: BATCH_SIZE)
|
|
end
|
|
|
|
def down
|
|
end
|
|
end
|