summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-06-28 15:24:53 +0200
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-06-28 15:24:53 +0200
commit187dd1005cd92c530146d7f5b0a89b368b09c3e9 (patch)
tree0495376a75e8c6b991d9fbc49e2cb17c095fd175
parent5292eb651e1e3595e409a4c216eb0be3445a9319 (diff)
downloadgitlab-ce-187dd1005cd92c530146d7f5b0a89b368b09c3e9.tar.gz
Add specs for delayed stage_id background migrations
-rw-r--r--db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb7
-rw-r--r--spec/migrations/migrate_stage_id_reference_in_background_spec.rb51
2 files changed, 51 insertions, 7 deletions
diff --git a/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb b/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb
index bfeb09f6da1..a73456af386 100644
--- a/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb
+++ b/db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb
@@ -15,9 +15,10 @@ class MigrateStageIdReferenceInBackground < ActiveRecord::Migration
Build.where(stage_id: nil)
.find_in_batches(batch_size: BATCH_SIZE)
.with_index do |builds, batch|
- migrations = builds.map { |build| [MIGRATION, [build.id]] }
-
- BackgroundMigrationWorker.perform_bulk(*migrations)
+ builds.each do |build|
+ schedule = (batch - 1) * 5.minutes
+ BackgroundMigrationWorker.perform_at(schedule, MIGRATION, [build.id])
+ end
end
end
diff --git a/spec/migrations/migrate_stage_id_reference_in_background_spec.rb b/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
index d515eb42b9d..8b497656377 100644
--- a/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
+++ b/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
@@ -1,7 +1,37 @@
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20170628080858_migrate_stage_id_reference_in_background')
-describe MigrateStageIdReferenceInBackground, :migration, :redis do
+RSpec::Matchers.define :have_migrated do |*expected|
+ match do |migration|
+ BackgroundMigrationWorker.jobs.any? do |job|
+ job['enqueued_at'].present? && job['args'] == [migration, expected]
+ end
+ end
+
+ failure_message do |migration|
+ <<-EOS
+ Background migration `#{migration}` with args `#{expected.inspect}`
+ not migrated!
+ EOS
+ end
+end
+
+RSpec::Matchers.define :have_scheduled_migration do |time, *expected|
+ match do |migration|
+ BackgroundMigrationWorker.jobs.any? do |job|
+ job['args'] == [migration, expected] && job['at'] >= time
+ end
+ end
+
+ failure_message do |migration|
+ <<-EOS
+ Background migration `#{migration}` with args `#{expected.inspect}`
+ not scheduled!
+ EOS
+ end
+end
+
+describe MigrateStageIdReferenceInBackground, :migration do
let(:jobs) { table(:ci_builds) }
let(:stages) { table(:ci_stages) }
let(:pipelines) { table(:ci_pipelines) }
@@ -23,11 +53,24 @@ describe MigrateStageIdReferenceInBackground, :migration, :redis do
stages.create(id: 103, pipeline_id: 1, project_id: 123, name: 'deploy')
end
+ it 'correctly schedules background migrations' do
+ Sidekiq::Testing.fake! do
+ migrate!
+
+ expect(described_class::MIGRATION).to have_migrated(1)
+ expect(described_class::MIGRATION).to have_migrated(2)
+ expect(described_class::MIGRATION).to have_scheduled_migration(5.minutes, 3)
+ expect(described_class::MIGRATION).to have_scheduled_migration(5.minutes, 4)
+ end
+ end
+
it 'schedules background migrations' do
- expect(jobs.where(stage_id: nil)).to be_present
+ Sidekiq::Testing.inline! do
+ expect(jobs.where(stage_id: nil)).to be_present
- migrate!
+ migrate!
- expect(jobs.where(stage_id: nil)).to be_empty
+ expect(jobs.where(stage_id: nil)).to be_empty
+ end
end
end