Skip to content

Clean up duplicate indexes on ci_trigger_requests

Stan Hu requested to merge sh-clean-duplicate-ci-trigger-request-indexes into master

Some installations somehow gained duplicate indexes on ci_trigger_requests.trigger_id.

As a result, upgrading to GitLab 12.4.0 may cause this error:

ArgumentError: Multiple indexes found on ci_trigger_requests columns [:trigger_id]. Specify an index name from ci_trigger_requests_trigger_id_idx, fk_rails_b8ec8b7245, index_ci_trigger_requests_on_trigger_id

This error comes from ActiveRecord's index_name_for_remove (https://github.com/rails/rails/blob/b9ca94caea2ca6a6cc09abaffaad67b447134079/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L1240-L1244). This method raises this exception if the remove_index is ambiguous.

Since our end state is to remove all indexes on ci_trigger_requests.trigger_id, find the indexes that have this signature and pass in an explicit name to disambiguate the index to drop.

Closes #34818 (closed)

Test output

$ RAILS_ENV=test bin/rails dbconsole
gitlabhq_test=# create index fk_rails_b8ec8b7245 on ci_trigger_requests (trigger_id);
CREATE INDEX
gitlabhq_test=# create index ci_trigger_requests_trigger_id_idx on ci_trigger_requests (trigger_id);
CREATE INDEX
$ RAILS_ENV=test bin/rake db:migrate:up VERSION=20191016072826
== 20191016072826 ReplaceCiTriggerRequestsIndex: migrating ====================
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:ci_trigger_requests, [:trigger_id, :id], {:order=>{:id=>:desc}, :algorithm=>:concurrently})
   -> 0.0042s
-- execute("SET statement_timeout TO 0")
   -> 0.0002s
-- add_index(:ci_trigger_requests, [:trigger_id, :id], {:order=>{:id=>:desc}, :algorithm=>:concurrently})
   -> 0.0031s
-- execute("RESET ALL")
   -> 0.0002s
-- indexes(:ci_trigger_requests)
   -> 0.0023s
-- transaction_open?()
   -> 0.0000s
-- select_one("SELECT current_setting('server_version_num') AS v")
   -> 0.0003s
-- index_exists?(:ci_trigger_requests, [:trigger_id], {:name=>"ci_trigger_requests_trigger_id_idx", :algorithm=>:concurrently})
   -> 0.0017s
-- execute("SET statement_timeout TO 0")
   -> 0.0002s
-- remove_index(:ci_trigger_requests, {:name=>"ci_trigger_requests_trigger_id_idx", :algorithm=>:concurrently, :column=>[:trigger_id]})
   -> 0.0032s
-- execute("RESET ALL")
   -> 0.0002s
-- transaction_open?()
   -> 0.0000s
-- select_one("SELECT current_setting('server_version_num') AS v")
   -> 0.0003s
-- index_exists?(:ci_trigger_requests, [:trigger_id], {:name=>"fk_rails_b8ec8b7245", :algorithm=>:concurrently})
   -> 0.0019s
-- execute("SET statement_timeout TO 0")
   -> 0.0002s
-- remove_index(:ci_trigger_requests, {:name=>"fk_rails_b8ec8b7245", :algorithm=>:concurrently, :column=>[:trigger_id]})
   -> 0.0026s
-- execute("RESET ALL")
   -> 0.0002s
-- transaction_open?()
   -> 0.0000s
-- select_one("SELECT current_setting('server_version_num') AS v")
   -> 0.0003s
-- index_exists?(:ci_trigger_requests, [:trigger_id], {:name=>"index_ci_trigger_requests_on_trigger_id", :algorithm=>:concurrently})
   -> 0.0018s
-- execute("SET statement_timeout TO 0")
   -> 0.0002s
-- remove_index(:ci_trigger_requests, {:name=>"index_ci_trigger_requests_on_trigger_id", :algorithm=>:concurrently, :column=>[:trigger_id]})
   -> 0.0024s
-- execute("RESET ALL")
   -> 0.0002s
== 20191016072826 ReplaceCiTriggerRequestsIndex: migrated (0.0266s) ===========
Edited by Stan Hu

Merge request reports