Commit c467451e authored by Grzegorz Bizon's avatar Grzegorz Bizon

Schedule stage_id bg migrations in batches of 10

parent b41b4d2e
...@@ -3,6 +3,7 @@ class MigrateStageIdReferenceInBackground < ActiveRecord::Migration ...@@ -3,6 +3,7 @@ class MigrateStageIdReferenceInBackground < ActiveRecord::Migration
DOWNTIME = false DOWNTIME = false
BATCH_SIZE = 10000 BATCH_SIZE = 10000
RANGE_SIZE = 1000
MIGRATION = 'MigrateBuildStageIdReference'.freeze MIGRATION = 'MigrateBuildStageIdReference'.freeze
disable_ddl_transaction! disable_ddl_transaction!
...@@ -17,10 +18,12 @@ class MigrateStageIdReferenceInBackground < ActiveRecord::Migration ...@@ -17,10 +18,12 @@ class MigrateStageIdReferenceInBackground < ActiveRecord::Migration
# #
def up def up
Build.all.each_batch(of: BATCH_SIZE) do |relation, index| Build.all.each_batch(of: BATCH_SIZE) do |relation, index|
relation.each_batch(of: RANGE_SIZE) do |relation|
range = relation.pluck('MIN(id)', 'MAX(id)').first range = relation.pluck('MIN(id)', 'MAX(id)').first
schedule = index * 2.minutes
BackgroundMigrationWorker.perform_in(schedule, MIGRATION, range) BackgroundMigrationWorker
.perform_in(index * 2.minutes, MIGRATION, range)
end
end end
end end
......
...@@ -2,7 +2,7 @@ module Gitlab ...@@ -2,7 +2,7 @@ module Gitlab
module BackgroundMigration module BackgroundMigration
class MigrateBuildStageIdReference class MigrateBuildStageIdReference
def perform(start_id, stop_id) def perform(start_id, stop_id)
scope = if stop_id.nonzero? scope = if stop_id.to_i.nonzero?
"ci_builds.id BETWEEN #{start_id.to_i} AND #{stop_id.to_i}" "ci_builds.id BETWEEN #{start_id.to_i} AND #{stop_id.to_i}"
else else
"ci_builds.id >= #{start_id.to_i}" "ci_builds.id >= #{start_id.to_i}"
......
...@@ -21,7 +21,8 @@ describe MigrateStageIdReferenceInBackground, :migration, :sidekiq do ...@@ -21,7 +21,8 @@ describe MigrateStageIdReferenceInBackground, :migration, :sidekiq do
let(:projects) { table(:projects) } let(:projects) { table(:projects) }
before do before do
stub_const("#{described_class.name}::BATCH_SIZE", 2) stub_const("#{described_class.name}::BATCH_SIZE", 3)
stub_const("#{described_class.name}::RANGE_SIZE", 2)
projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1') projects.create!(id: 123, name: 'gitlab1', path: 'gitlab1')
projects.create!(id: 345, name: 'gitlab2', path: 'gitlab2') projects.create!(id: 345, name: 'gitlab2', path: 'gitlab2')
...@@ -48,9 +49,10 @@ describe MigrateStageIdReferenceInBackground, :migration, :sidekiq do ...@@ -48,9 +49,10 @@ describe MigrateStageIdReferenceInBackground, :migration, :sidekiq do
migrate! migrate!
expect(described_class::MIGRATION).to be_scheduled_migration(2.minutes, 1, 2) expect(described_class::MIGRATION).to be_scheduled_migration(2.minutes, 1, 2)
expect(described_class::MIGRATION).to be_scheduled_migration(4.minutes, 3, 4) expect(described_class::MIGRATION).to be_scheduled_migration(2.minutes, 3, 3)
expect(described_class::MIGRATION).to be_scheduled_migration(6.minutes, 5, 6) expect(described_class::MIGRATION).to be_scheduled_migration(4.minutes, 4, 5)
expect(BackgroundMigrationWorker.jobs.size).to eq 3 expect(described_class::MIGRATION).to be_scheduled_migration(4.minutes, 6, 6)
expect(BackgroundMigrationWorker.jobs.size).to eq 4
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment