From 304b43a6227733d9326bca3a379c9588cbe93a8d Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Mon, 10 Jun 2019 13:25:51 -0300 Subject: Avoid DB timeouts when scheduling migrations --- .../osw-fix-post-dep-migration-with-timeout.yml | 5 +++++ .../20190528180441_enqueue_reset_merge_status.rb | 15 +++++---------- spec/migrations/enqueue_reset_merge_status_spec.rb | 7 +++++-- 3 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 changelogs/unreleased/osw-fix-post-dep-migration-with-timeout.yml diff --git a/changelogs/unreleased/osw-fix-post-dep-migration-with-timeout.yml b/changelogs/unreleased/osw-fix-post-dep-migration-with-timeout.yml new file mode 100644 index 00000000000..6b37bb11ad5 --- /dev/null +++ b/changelogs/unreleased/osw-fix-post-dep-migration-with-timeout.yml @@ -0,0 +1,5 @@ +--- +title: Avoid DB timeouts when scheduling migrations +merge_request: 29437 +author: +type: fixed diff --git a/db/post_migrate/20190528180441_enqueue_reset_merge_status.rb b/db/post_migrate/20190528180441_enqueue_reset_merge_status.rb index 1b668d85bac..a3d2f497806 100644 --- a/db/post_migrate/20190528180441_enqueue_reset_merge_status.rb +++ b/db/post_migrate/20190528180441_enqueue_reset_merge_status.rb @@ -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 diff --git a/spec/migrations/enqueue_reset_merge_status_spec.rb b/spec/migrations/enqueue_reset_merge_status_spec.rb index 0d5e33bfd46..a6dd2e08079 100644 --- a/spec/migrations/enqueue_reset_merge_status_spec.rb +++ b/spec/migrations/enqueue_reset_merge_status_spec.rb @@ -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 -- cgit v1.2.1