summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLin Jen-Shin <godfat@godfat.org>2017-05-19 15:50:55 +0800
committerLin Jen-Shin <godfat@godfat.org>2017-05-19 18:43:41 +0800
commit1aa672472e8a431089c392839bc6a374330c2f7c (patch)
tree66d7b2bc67b39d78853dfb3d4dc827a6440840c6
parent01a7f333026ab7031122075d1c797423005ca56b (diff)
downloadgitlab-ce-update-retried-migration.tar.gz
Add temporary partial index to speed up the migrationupdate-retried-migration
Closes #32469
-rw-r--r--db/post_migrate/20170503004427_upate_retried_for_ci_build.rb42
1 files changed, 28 insertions, 14 deletions
diff --git a/db/post_migrate/20170503004427_upate_retried_for_ci_build.rb b/db/post_migrate/20170503004427_upate_retried_for_ci_build.rb
index 80215d662e4..9b20edeb4c3 100644
--- a/db/post_migrate/20170503004427_upate_retried_for_ci_build.rb
+++ b/db/post_migrate/20170503004427_upate_retried_for_ci_build.rb
@@ -2,28 +2,42 @@ class UpateRetriedForCiBuild < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
-
+
disable_ddl_transaction!
def up
disable_statement_timeout
- latest_id = <<-SQL.strip_heredoc
- SELECT MAX(ci_builds2.id)
- FROM ci_builds ci_builds2
- WHERE ci_builds.commit_id=ci_builds2.commit_id
- AND ci_builds.name=ci_builds2.name
- SQL
-
- # This is slow update as it does single-row query
- # This is designed to be run as idle, or a post deployment migration
- is_retried = Arel.sql("((#{latest_id}) != ci_builds.id)")
-
- update_column_in_batches(:ci_builds, :retried, is_retried) do |table, query|
- query.where(table[:retried].eq(nil))
+ with_temporary_partial_index do
+ latest_id = <<-SQL.strip_heredoc
+ SELECT MAX(ci_builds2.id)
+ FROM ci_builds ci_builds2
+ WHERE ci_builds.commit_id=ci_builds2.commit_id
+ AND ci_builds.name=ci_builds2.name
+ SQL
+
+ # This is slow update as it does single-row query
+ # This is designed to be run as idle, or a post deployment migration
+ is_retried = Arel.sql("((#{latest_id}) != ci_builds.id)")
+
+ update_column_in_batches(:ci_builds, :retried, is_retried) do |table, query|
+ query.where(table[:retried].eq(nil))
+ end
end
end
def down
end
+
+ def with_temporary_partial_index
+ if Gitlab::Database.postgresql?
+ execute 'CREATE INDEX CONCURRENTLY IF NOT EXISTS index_for_ci_builds_retried_migration ON ci_builds (id) WHERE retried IS NULL;'
+ end
+
+ yield
+
+ if Gitlab::Database.postgresql?
+ execute 'DROP INDEX CONCURRENTLY IF EXISTS index_for_ci_builds_retried_migration'
+ end
+ end
end