Merge branch 'osw-fix-post-dep-migration-with-timeout' into 'master'

Avoid DB timeouts when scheduling migrations

Closes #63036

See merge request gitlab-org/gitlab-ce!29437
This commit is contained in:
Stan Hu 2019-06-10 17:36:19 +00:00
commit 9254b5d4c0
3 changed files with 15 additions and 12 deletions

View File

@ -0,0 +1,5 @@
---
title: Avoid DB timeouts when scheduling migrations
merge_request: 29437
author:
type: fixed

View File

@ -16,15 +16,10 @@ class EnqueueResetMergeStatus < ActiveRecord::Migration[5.1]
def up
say 'Scheduling `ResetMergeStatus` jobs'
# We currently have around 135_000 opened, mergeable MRs in GitLab.com. This iteration
# will schedule around 13 batches of 10_000 MRs, which should take around 1 hour to
# complete.
relation = MergeRequest.where(state: 'opened', merge_status: 'can_be_merged')
relation.each_batch(of: BATCH_SIZE) do |batch, index|
range = batch.pluck('MIN(id)', 'MAX(id)').first
BackgroundMigrationWorker.perform_in(index * DELAY_INTERVAL, MIGRATION, range)
end
# We currently have more than ~5_000_000 merge request records on GitLab.com.
# This means it'll schedule ~500 jobs (10k MRs each) with a 5 minutes gap,
# so this should take ~41 hours for all background migrations to complete.
# ((5_000_000 / 10_000) * 5) / 60 => 41.6666..
queue_background_migration_jobs_by_range_at_intervals(MergeRequest, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
end
end

View File

@ -40,9 +40,12 @@ describe EnqueueResetMergeStatus, :migration, :sidekiq do
.to be_scheduled_delayed_migration(5.minutes, 1, 2)
expect(described_class::MIGRATION)
.to be_scheduled_delayed_migration(10.minutes, 3, 3)
.to be_scheduled_delayed_migration(10.minutes, 3, 4)
expect(BackgroundMigrationWorker.jobs.size).to eq(2)
expect(described_class::MIGRATION)
.to be_scheduled_delayed_migration(15.minutes, 5, 5)
expect(BackgroundMigrationWorker.jobs.size).to eq(3)
end
end
end