Skip to content

Remove state column from issues and merge_requests

Felipe Artur requested to merge drop_old_state_column_from_issues into master

What does this MR do?

Remove state column form issues and merge_requests tables.

The column is being ignored since 12.6: !19574 (merged)

Migration output

up

== 20200219183456 RemoveIssueStateIndexes: migrating ==========================
-- transaction_open?()
   -> 0.0000s
-- indexes(:issues)
   -> 0.0076s
-- execute("SET statement_timeout TO 0")
   -> 0.0006s
-- remove_index(:issues, {:algorithm=>:concurrently, :name=>"index_issues_on_state"})
   -> 0.0051s
-- execute("RESET ALL")
   -> 0.0007s
-- transaction_open?()
   -> 0.0000s
-- indexes(:issues)
   -> 0.0075s
-- execute("SET statement_timeout TO 0")
   -> 0.0006s
-- remove_index(:issues, {:algorithm=>:concurrently, :name=>"index_issues_on_project_id_and_created_at_and_id_and_state"})
   -> 0.0019s
-- execute("RESET ALL")
   -> 0.0005s
-- transaction_open?()
   -> 0.0000s
-- indexes(:issues)
   -> 0.0101s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- remove_index(:issues, {:algorithm=>:concurrently, :name=>"idx_issues_on_project_id_and_due_date_and_id_and_state_partial"})
   -> 0.0018s
-- execute("RESET ALL")
   -> 0.0004s
-- transaction_open?()
   -> 0.0000s
-- indexes(:issues)
   -> 0.0055s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- remove_index(:issues, {:algorithm=>:concurrently, :name=>"index_issues_on_project_id_and_rel_position_and_state_and_id"})
   -> 0.0017s
-- execute("RESET ALL")
   -> 0.0004s
-- transaction_open?()
   -> 0.0000s
-- indexes(:issues)
   -> 0.0064s
-- execute("SET statement_timeout TO 0")
   -> 0.0005s
-- remove_index(:issues, {:algorithm=>:concurrently, :name=>"index_issues_on_project_id_and_updated_at_and_id_and_state"})
   -> 0.0021s
-- execute("RESET ALL")
   -> 0.0004s
== 20200219183456 RemoveIssueStateIndexes: migrated (0.0558s) =================

== 20200219184219 RemoveMergeRequestStateIndexes: migrating ===================
-- transaction_open?()
   -> 0.0000s
-- indexes(:merge_requests)
   -> 0.0089s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- remove_index(:merge_requests, {:algorithm=>:concurrently, :name=>"index_merge_requests_on_id_and_merge_jid"})
   -> 0.0023s
-- execute("RESET ALL")
   -> 0.0004s
-- transaction_open?()
   -> 0.0000s
-- indexes(:merge_requests)
   -> 0.0064s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- remove_index(:merge_requests, {:algorithm=>:concurrently, :name=>"index_merge_requests_on_source_project_and_branch_state_opened"})
   -> 0.0017s
-- execute("RESET ALL")
   -> 0.0003s
-- transaction_open?()
   -> 0.0000s
-- indexes(:merge_requests)
   -> 0.0079s
-- execute("SET statement_timeout TO 0")
   -> 0.0014s
-- remove_index(:merge_requests, {:algorithm=>:concurrently, :name=>"index_merge_requests_on_state_and_merge_status"})
   -> 0.0021s
-- execute("RESET ALL")
   -> 0.0004s
-- transaction_open?()
   -> 0.0000s
-- indexes(:merge_requests)
   -> 0.0071s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- remove_index(:merge_requests, {:algorithm=>:concurrently, :name=>"index_merge_requests_on_target_project_id_and_iid_opened"})
   -> 0.0019s
-- execute("RESET ALL")
   -> 0.0004s
== 20200219184219 RemoveMergeRequestStateIndexes: migrated (0.0434s) ==========

== 20200219193058 RemoveStateFromIssues: migrating ============================
-- column_exists?(:issues, :state)
   -> 0.0023s
-- remove_column(:issues, :state, :string)
   -> 0.0006s
== 20200219193058 RemoveStateFromIssues: migrated (0.0063s) ===================

== 20200219193117 RemoveStateFromMergeRequests: migrating =====================
-- column_exists?(:merge_requests, :state)
   -> 0.0030s
-- remove_column(:merge_requests, :state, :string)
   -> 0.0028s
== 20200219193117 RemoveStateFromMergeRequests: migrated (0.0061s) ============

down

== 20200219193117 RemoveStateFromMergeRequests: reverting =====================
-- column_exists?(:merge_requests, :state)
   -> 0.0040s
-- add_column(:merge_requests, :state, :string)
   -> 0.0037s
== 20200219193117 RemoveStateFromMergeRequests: reverted (0.0078s) ============

== 20200219193058 RemoveStateFromIssues: reverting ============================
-- column_exists?(:issues, :state)
   -> 0.0038s
-- add_column(:issues, :state, :string)
   -> 0.0008s
== 20200219193058 RemoveStateFromIssues: reverted (0.0084s) ===================

== 20200219184219 RemoveMergeRequestStateIndexes: reverting ===================
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:merge_requests, [:id, :merge_jid], {:where=>"merge_jid IS NOT NULL and state = 'locked'", :name=>"index_merge_requests_on_id_and_merge_jid", :algorithm=>:concurrently})
   -> 0.0119s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- add_index(:merge_requests, [:id, :merge_jid], {:where=>"merge_jid IS NOT NULL and state = 'locked'", :name=>"index_merge_requests_on_id_and_merge_jid", :algorithm=>:concurrently})
   -> 0.0054s
-- execute("RESET ALL")
   -> 0.0005s
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:merge_requests, [:source_project_id, :source_branch], {:where=>"state = 'opened'", :name=>"index_merge_requests_on_source_project_and_branch_state_opened", :algorithm=>:concurrently})
   -> 0.0059s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- add_index(:merge_requests, [:source_project_id, :source_branch], {:where=>"state = 'opened'", :name=>"index_merge_requests_on_source_project_and_branch_state_opened", :algorithm=>:concurrently})
   -> 0.0058s
-- execute("RESET ALL")
   -> 0.0004s
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:merge_requests, [:state, :merge_status], {:where=>"state = 'opened' AND merge_status = 'can_be_merged'", :name=>"index_merge_requests_on_state_and_merge_status", :algorithm=>:concurrently})
   -> 0.0107s
-- execute("SET statement_timeout TO 0")
   -> 0.0007s
-- add_index(:merge_requests, [:state, :merge_status], {:where=>"state = 'opened' AND merge_status = 'can_be_merged'", :name=>"index_merge_requests_on_state_and_merge_status", :algorithm=>:concurrently})
   -> 0.0054s
-- execute("RESET ALL")
   -> 0.0006s
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:merge_requests, [:target_project_id, :iid], {:where=>"state = 'opened'", :name=>"index_merge_requests_on_target_project_id_and_iid_opened", :algorithm=>:concurrently})
   -> 0.0071s
-- execute("SET statement_timeout TO 0")
   -> 0.0006s
-- add_index(:merge_requests, [:target_project_id, :iid], {:where=>"state = 'opened'", :name=>"index_merge_requests_on_target_project_id_and_iid_opened", :algorithm=>:concurrently})
   -> 0.0057s
-- execute("RESET ALL")
   -> 0.0005s
== 20200219184219 RemoveMergeRequestStateIndexes: reverted (0.0629s) ==========

== 20200219183456 RemoveIssueStateIndexes: reverting ==========================
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:issues, :state, {:name=>"index_issues_on_state", :algorithm=>:concurrently})
   -> 0.0077s
-- execute("SET statement_timeout TO 0")
   -> 0.0006s
-- add_index(:issues, :state, {:name=>"index_issues_on_state", :algorithm=>:concurrently})
   -> 0.0055s
-- execute("RESET ALL")
   -> 0.0006s
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:issues, [:project_id, :created_at, :id, :state], {:name=>"index_issues_on_project_id_and_created_at_and_id_and_state", :algorithm=>:concurrently})
   -> 0.0058s
-- execute("SET statement_timeout TO 0")
   -> 0.0005s
-- add_index(:issues, [:project_id, :created_at, :id, :state], {:name=>"index_issues_on_project_id_and_created_at_and_id_and_state", :algorithm=>:concurrently})
   -> 0.0052s
-- execute("RESET ALL")
   -> 0.0004s
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:issues, [:project_id, :due_date, :id, :state], {:where=>"due_date IS NOT NULL", :name=>"idx_issues_on_project_id_and_due_date_and_id_and_state_partial", :algorithm=>:concurrently})
   -> 0.0098s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- add_index(:issues, [:project_id, :due_date, :id, :state], {:where=>"due_date IS NOT NULL", :name=>"idx_issues_on_project_id_and_due_date_and_id_and_state_partial", :algorithm=>:concurrently})
   -> 0.0078s
-- execute("RESET ALL")
   -> 0.0004s
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:issues, [:project_id, :relative_position, :state, :id], {:order=>{:id=>:desc}, :name=>"index_issues_on_project_id_and_rel_position_and_state_and_id", :algorithm=>:concurrently})
   -> 0.0063s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- add_index(:issues, [:project_id, :relative_position, :state, :id], {:order=>{:id=>:desc}, :name=>"index_issues_on_project_id_and_rel_position_and_state_and_id", :algorithm=>:concurrently})
   -> 0.0057s
-- execute("RESET ALL")
   -> 0.0006s
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:issues, [:project_id, :updated_at, :id, :state], {:name=>"index_issues_on_project_id_and_updated_at_and_id_and_state", :algorithm=>:concurrently})
   -> 0.0097s
-- execute("SET statement_timeout TO 0")
   -> 0.0004s
-- add_index(:issues, [:project_id, :updated_at, :id, :state], {:name=>"index_issues_on_project_id_and_updated_at_and_id_and_state", :algorithm=>:concurrently})
   -> 0.0053s
-- execute("RESET ALL")
   -> 0.0005s
== 20200219183456 RemoveIssueStateIndexes: reverted (0.0750s) =================

Schema diff after executing down methods
diff --git a/db/schema.rb b/db/schema.rb
index 70445dc527e..21af1db7dd5 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -2205,6 +2205,7 @@ ActiveRecord::Schema.define(version: 2020_03_06_170531) do
     t.integer "duplicated_to_id"
     t.integer "promoted_to_epic_id"
     t.integer "health_status", limit: 2
+    t.string "state"
     t.index ["author_id"], name: "index_issues_on_author_id"
     t.index ["closed_by_id"], name: "index_issues_on_closed_by_id"
     t.index ["confidential"], name: "index_issues_on_confidential"
@@ -2213,13 +2214,18 @@ ActiveRecord::Schema.define(version: 2020_03_06_170531) do
     t.index ["lock_version"], name: "index_issues_on_lock_version", where: "(lock_version IS NULL)"
     t.index ["milestone_id"], name: "index_issues_on_milestone_id"
     t.index ["moved_to_id"], name: "index_issues_on_moved_to_id", where: "(moved_to_id IS NOT NULL)"
+    t.index ["project_id", "created_at", "id", "state"], name: "index_issues_on_project_id_and_created_at_and_id_and_state"
     t.index ["project_id", "created_at", "id", "state_id"], name: "idx_issues_on_project_id_and_created_at_and_id_and_state_id"
+    t.index ["project_id", "due_date", "id", "state"], name: "idx_issues_on_project_id_and_due_date_and_id_and_state_partial", where: "(due_date IS NOT NULL)"
     t.index ["project_id", "due_date", "id", "state_id"], name: "idx_issues_on_project_id_and_due_date_and_id_and_state_id", where: "(due_date IS NOT NULL)"
     t.index ["project_id", "iid"], name: "index_issues_on_project_id_and_iid", unique: true
+    t.index ["project_id", "relative_position", "state", "id"], name: "index_issues_on_project_id_and_rel_position_and_state_and_id", order: { id: :desc }
     t.index ["project_id", "relative_position", "state_id", "id"], name: "idx_issues_on_project_id_and_rel_position_and_state_id_and_id", order: { id: :desc }
+    t.index ["project_id", "updated_at", "id", "state"], name: "index_issues_on_project_id_and_updated_at_and_id_and_state"
     t.index ["project_id", "updated_at", "id", "state_id"], name: "idx_issues_on_project_id_and_updated_at_and_id_and_state_id"
     t.index ["promoted_to_epic_id"], name: "index_issues_on_promoted_to_epic_id", where: "(promoted_to_epic_id IS NOT NULL)"
     t.index ["relative_position"], name: "index_issues_on_relative_position"
+    t.index ["state"], name: "index_issues_on_state"
     t.index ["state_id"], name: "idx_issues_on_state_id"
     t.index ["title"], name: "index_issues_on_title_trigram", opclass: :gin_trgm_ops, using: :gin
     t.index ["updated_at"], name: "index_issues_on_updated_at"
@@ -2616,24 +2622,29 @@ ActiveRecord::Schema.define(version: 2020_03_06_170531) do
     t.integer "state_id", limit: 2, default: 1, null: false
     t.string "rebase_jid"
     t.binary "squash_commit_sha"
+    t.string "state"
     t.index ["assignee_id"], name: "index_merge_requests_on_assignee_id"
     t.index ["author_id"], name: "index_merge_requests_on_author_id"
     t.index ["created_at"], name: "index_merge_requests_on_created_at"
     t.index ["description"], name: "index_merge_requests_on_description_trigram", opclass: :gin_trgm_ops, using: :gin
     t.index ["head_pipeline_id"], name: "index_merge_requests_on_head_pipeline_id"
     t.index ["id", "merge_jid"], name: "idx_merge_requests_on_id_and_merge_jid", where: "((merge_jid IS NOT NULL) AND (state_id = 4))"
+    t.index ["id", "merge_jid"], name: "index_merge_requests_on_id_and_merge_jid", where: "((merge_jid IS NOT NULL) AND ((state)::text = 'locked'::text))"
     t.index ["latest_merge_request_diff_id"], name: "index_merge_requests_on_latest_merge_request_diff_id"
     t.index ["lock_version"], name: "index_merge_requests_on_lock_version", where: "(lock_version IS NULL)"
     t.index ["merge_user_id"], name: "index_merge_requests_on_merge_user_id", where: "(merge_user_id IS NOT NULL)"
     t.index ["milestone_id"], name: "index_merge_requests_on_milestone_id"
     t.index ["source_branch"], name: "index_merge_requests_on_source_branch"
     t.index ["source_project_id", "source_branch"], name: "idx_merge_requests_on_source_project_and_branch_state_opened", where: "(state_id = 1)"
+    t.index ["source_project_id", "source_branch"], name: "index_merge_requests_on_source_project_and_branch_state_opened", where: "((state)::text = 'opened'::text)"
     t.index ["source_project_id", "source_branch"], name: "index_merge_requests_on_source_project_id_and_source_branch"
+    t.index ["state", "merge_status"], name: "index_merge_requests_on_state_and_merge_status", where: "(((state)::text = 'opened'::text) AND ((merge_status)::text = 'can_be_merged'::text))"
     t.index ["state_id", "merge_status"], name: "idx_merge_requests_on_state_id_and_merge_status", where: "((state_id = 1) AND ((merge_status)::text = 'can_be_merged'::text))"
     t.index ["target_branch"], name: "index_merge_requests_on_target_branch"
     t.index ["target_project_id", "created_at"], name: "index_merge_requests_target_project_id_created_at"
     t.index ["target_project_id", "iid"], name: "idx_merge_requests_on_target_project_id_and_iid_opened", where: "(state_id = 1)"
     t.index ["target_project_id", "iid"], name: "index_merge_requests_on_target_project_id_and_iid", unique: true
+    t.index ["target_project_id", "iid"], name: "index_merge_requests_on_target_project_id_and_iid_opened", where: "((state)::text = 'opened'::text)"
     t.index ["target_project_id", "merge_commit_sha", "id"], name: "index_merge_requests_on_tp_id_and_merge_commit_sha_and_id"
     t.index ["target_project_id", "target_branch"], name: "index_merge_requests_on_target_project_id_and_target_branch", where: "((state_id = 1) AND (merge_when_pipeline_succeeds = true))"
     t.index ["title"], name: "index_merge_requests_on_title"

Testing on database lab it took 1 minutes to drop the column for issues and 35 seconds for merge_requests

exec ALTER TABLE issues DROP COLUMN state
The query has been executed. Duration: 1.078 min (edited) 

exec ALTER TABLE merge_requests DROP COLUMN state
The query has been executed. Duration: 35.980 s (edited) 

related to #36370 (closed)

Edited by Felipe Artur

Merge request reports