Fix migration for removing MR diff indexes

For whatever reason on some PostgreSQL installations there would be a
separate UNIQUE constraint on the merge_request_id column. Rails'
index_exists?() returns false for this constraint (even when using the
full name), yet the indexes() method returns it.

This commit changes the migration so that the constraint is dropped as
well. MySQL installations don't appear to be affected.

Fixes gitlab-org/gitlab-ce#22136
This commit is contained in:
Yorick Peterse 2016-09-14 16:18:49 +02:00
parent eab72755cd
commit fd4ad65462
No known key found for this signature in database
GPG Key ID: EDD30D2BEB691AC9
1 changed files with 17 additions and 3 deletions

View File

@ -8,14 +8,28 @@ class MergeRequestDiffRemoveUniq < ActiveRecord::Migration
DOWNTIME = false
def up
if index_exists?(:merge_request_diffs, :merge_request_id)
remove_index :merge_request_diffs, :merge_request_id
constraint_name = 'merge_request_diffs_merge_request_id_key'
transaction do
if index_exists?(:merge_request_diffs, :merge_request_id)
remove_index(:merge_request_diffs, :merge_request_id)
end
# In some bizarre cases PostgreSQL might have a separate unique constraint
# that we'll need to drop.
if constraint_exists?(constraint_name) && Gitlab::Database.postgresql?
execute("ALTER TABLE merge_request_diffs DROP CONSTRAINT IF EXISTS #{constraint_name};")
end
end
end
def down
unless index_exists?(:merge_request_diffs, :merge_request_id)
add_concurrent_index :merge_request_diffs, :merge_request_id, unique: true
add_concurrent_index(:merge_request_diffs, :merge_request_id, unique: true)
end
end
def constraint_exists?(name)
indexes(:merge_request_diffs).map(&:name).include?(name)
end
end