Fixes broken MySQL migration for retried
> Mysql2::Error: Table 'ci_builds' is specified twice, both as a target for 'UPDATE' and as a separate source for data: UPDATE `ci_builds` SET `retried` = ((SELECT MAX(ci_builds2.id) Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/32647
This commit is contained in:
parent
6233e56e99
commit
b5918f222b
|
@ -8,6 +8,32 @@ class UpateRetriedForCiBuild < ActiveRecord::Migration
|
||||||
def up
|
def up
|
||||||
disable_statement_timeout
|
disable_statement_timeout
|
||||||
|
|
||||||
|
if Gitlab::Database.mysql?
|
||||||
|
up_mysql
|
||||||
|
else
|
||||||
|
up_postgres
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def up_mysql
|
||||||
|
# This is a trick to overcome MySQL limitation:
|
||||||
|
# Mysql2::Error: Table 'ci_builds' is specified twice, both as a target for 'UPDATE' and as a separate source for data
|
||||||
|
# However, this leads to create a temporary table from `max(ci_builds.id)` which is slow and do full database update
|
||||||
|
execute <<-SQL.strip_heredoc
|
||||||
|
UPDATE ci_builds SET retried=
|
||||||
|
(id NOT IN (
|
||||||
|
SELECT * FROM (SELECT MAX(ci_builds.id) FROM ci_builds GROUP BY commit_id, name) AS latest_jobs
|
||||||
|
))
|
||||||
|
WHERE retried IS NULL
|
||||||
|
SQL
|
||||||
|
end
|
||||||
|
|
||||||
|
def up_postgres
|
||||||
with_temporary_partial_index do
|
with_temporary_partial_index do
|
||||||
latest_id = <<-SQL.strip_heredoc
|
latest_id = <<-SQL.strip_heredoc
|
||||||
SELECT MAX(ci_builds2.id)
|
SELECT MAX(ci_builds2.id)
|
||||||
|
@ -26,9 +52,6 @@ class UpateRetriedForCiBuild < ActiveRecord::Migration
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def down
|
|
||||||
end
|
|
||||||
|
|
||||||
def with_temporary_partial_index
|
def with_temporary_partial_index
|
||||||
if Gitlab::Database.postgresql?
|
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;'
|
execute 'CREATE INDEX CONCURRENTLY IF NOT EXISTS index_for_ci_builds_retried_migration ON ci_builds (id) WHERE retried IS NULL;'
|
||||||
|
|
Loading…
Reference in New Issue