summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-06-28 12:01:52 +0200
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-06-28 12:01:52 +0200
commit98992c4e4b3231a99eb5ff17c44e96fe79a6cff2 (patch)
treee8c8a1ae310303bb6af32cdf53b68bf691b1d867
parentb21ee2ee36e1aaddbe0b3541a8cac5f117143b66 (diff)
downloadgitlab-ce-98992c4e4b3231a99eb5ff17c44e96fe79a6cff2.tar.gz
Add initial build stage_id ref background migration
-rw-r--r--db/post_migrate/20170628080858_migrate_stage_id_reference_in_background.rb10
-rw-r--r--lib/gitlab/background_migration/migrate_build_stage_id_reference.rb18
-rw-r--r--spec/migrations/migrate_stage_id_reference_in_background_spec.rb5
3 files changed, 26 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 2eaa798d0aa..44bac4a8cc7 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
@@ -3,7 +3,17 @@ class MigrateStageIdReferenceInBackground < ActiveRecord::Migration
DOWNTIME = false
+ disable_ddl_transaction!
+
+ class Build < ActiveRecord::Base
+ self.table_name = 'ci_builds'
+ end
+
def up
+ Build.find_each do |build|
+ BackgroundMigrationWorker
+ .perform_async('MigrateBuildStageIdReference', [build.id])
+ end
end
def down
diff --git a/lib/gitlab/background_migration/migrate_build_stage_id_reference.rb b/lib/gitlab/background_migration/migrate_build_stage_id_reference.rb
index b554c3e079b..87c6c4ed49f 100644
--- a/lib/gitlab/background_migration/migrate_build_stage_id_reference.rb
+++ b/lib/gitlab/background_migration/migrate_build_stage_id_reference.rb
@@ -1,15 +1,19 @@
module Gitlab
module BackgroundMigration
class MigrateBuildStageIdReference
- class Build < ActiveRecord::Base
- self.table_name = 'ci_builds'
- end
+ def perform(id)
+ raise ArgumentError unless id.is_a?(Integer)
- class Stage < ActiveRecord::Base
- self.table_name = 'ci_stages'
- end
+ sql = <<-SQL.strip_heredoc
+ UPDATE "ci_builds" SET "stage_id" = (
+ SELECT id FROM ci_stages
+ WHERE ci_stages.pipeline_id = ci_builds.commit_id
+ AND ci_stages.name = ci_builds.stage
+ )
+ WHERE "ci_builds"."id" = #{id} AND "ci_builds"."stage_id" IS NULL
+ SQL
- def perform(id)
+ ActiveRecord::Base.connection.execute(sql)
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 f86ef834afa..ea3a18802d9 100644
--- a/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
+++ b/spec/migrations/migrate_stage_id_reference_in_background_spec.rb
@@ -22,5 +22,10 @@ describe MigrateStageIdReferenceInBackground, :migration, :redis do
end
it 'schedules background migrations' do
+ expect(jobs.where(stage_id: nil)).to be_present
+
+ migrate!
+
+ expect(jobs.where(stage_id: nil)).to be_empty
end
end