From 9106975d3caacdda43ed6c0387d741f6c0795d27 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 12 Sep 2017 13:52:25 +0200 Subject: Steal stages statuses migration --- ...170912113435_clean_stages_statuses_migration.rb | 15 ++++++++++ .../clean_stages_statuses_migration_spec.rb | 35 ++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 db/migrate/20170912113435_clean_stages_statuses_migration.rb create mode 100644 spec/migrations/clean_stages_statuses_migration_spec.rb diff --git a/db/migrate/20170912113435_clean_stages_statuses_migration.rb b/db/migrate/20170912113435_clean_stages_statuses_migration.rb new file mode 100644 index 00000000000..31fd240d3dc --- /dev/null +++ b/db/migrate/20170912113435_clean_stages_statuses_migration.rb @@ -0,0 +1,15 @@ +class CleanStagesStatusesMigration < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + Gitlab::BackgroundMigration.steal('MigrateStageStatus') + end + + def down + # noop + end +end diff --git a/spec/migrations/clean_stages_statuses_migration_spec.rb b/spec/migrations/clean_stages_statuses_migration_spec.rb new file mode 100644 index 00000000000..822a188e67d --- /dev/null +++ b/spec/migrations/clean_stages_statuses_migration_spec.rb @@ -0,0 +1,35 @@ +require 'spec_helper' +require Rails.root.join('db', 'migrate', '20170912113435_clean_stages_statuses_migration.rb') + +describe CleanStagesStatusesMigration, :migration, :sidekiq, :redis do + let(:migration) { spy('migration') } + + before do + allow(Gitlab::BackgroundMigration::MigrateStageStatus) + .to receive(:new).and_return(migration) + end + + context 'when there are pending background migrations' do + it 'processes pending jobs synchronously' do + Sidekiq::Testing.disable! do + BackgroundMigrationWorker + .perform_in(2.minutes, 'MigrateStageStatus', [1, 1]) + BackgroundMigrationWorker + .perform_async('MigrateStageStatus', [1, 1]) + + migrate! + + expect(migration).to have_received(:perform).with(1, 1).twice + end + end + end + context 'when there are no background migrations pending' do + it 'does nothing' do + Sidekiq::Testing.disable! do + migrate! + + expect(migration).not_to have_received(:perform) + end + end + end +end -- cgit v1.2.3 From 73d31251af6e0574423990836e56350b8ffbea41 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 18 Sep 2017 13:47:46 +0200 Subject: Make sure all stages are migrated after a cleanup --- .../20170912113435_clean_stages_statuses_migration.rb | 11 +++++++++++ spec/migrations/clean_stages_statuses_migration_spec.rb | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/db/migrate/20170912113435_clean_stages_statuses_migration.rb b/db/migrate/20170912113435_clean_stages_statuses_migration.rb index 31fd240d3dc..fc091d7894e 100644 --- a/db/migrate/20170912113435_clean_stages_statuses_migration.rb +++ b/db/migrate/20170912113435_clean_stages_statuses_migration.rb @@ -5,8 +5,19 @@ class CleanStagesStatusesMigration < ActiveRecord::Migration disable_ddl_transaction! + class Stage < ActiveRecord::Base + include ::EachBatch + self.table_name = 'ci_stages' + end + def up Gitlab::BackgroundMigration.steal('MigrateStageStatus') + + Stage.where('status IS NULL').each_batch(of: 50) do |batch| + range = batch.pluck('MIN(id)', 'MAX(id)').first + + Gitlab::BackgroundMigration::MigrateStageStatus.new.perform(*range) + end end def down diff --git a/spec/migrations/clean_stages_statuses_migration_spec.rb b/spec/migrations/clean_stages_statuses_migration_spec.rb index 822a188e67d..38705f8eaae 100644 --- a/spec/migrations/clean_stages_statuses_migration_spec.rb +++ b/spec/migrations/clean_stages_statuses_migration_spec.rb @@ -23,6 +23,7 @@ describe CleanStagesStatusesMigration, :migration, :sidekiq, :redis do end end end + context 'when there are no background migrations pending' do it 'does nothing' do Sidekiq::Testing.disable! do @@ -32,4 +33,19 @@ describe CleanStagesStatusesMigration, :migration, :sidekiq, :redis do end end end + + context 'when there are still unmigrated stages afterwards' do + let(:stages) { table('ci_stages') } + + before do + stages.create!(status: nil, name: 'build') + stages.create!(status: nil, name: 'test') + end + + it 'migrates statuses sequentially in batches' do + migrate! + + expect(migration).to have_received(:perform).once + end + end end -- cgit v1.2.3