diff options
author | Ruben Davila <rdavila84@gmail.com> | 2017-02-07 17:30:14 +0300 |
---|---|---|
committer | Ruben Davila <rdavila84@gmail.com> | 2017-02-07 18:42:42 +0300 |
commit | 85a98fd40fbfbc4657ca910e8885015e50ca105d (patch) | |
tree | 29d8b884fbe509f19bdcecd3b03a3ee842157d5a /db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb | |
parent | bdc932245088b3a7ae5d633e81175352d5599083 (diff) |
Refactor migration to not require downtime
Diffstat (limited to 'db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb')
-rw-r--r-- | db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb b/db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb index 7956463e12c..69bfa2d3fc4 100644 --- a/db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb +++ b/db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb @@ -5,11 +5,11 @@ class AddForeignKeysToTimelogs < ActiveRecord::Migration include Gitlab::Database::MigrationHelpers # Set this constant to true if this migration requires downtime. - DOWNTIME = true + DOWNTIME = false # When a migration requires downtime you **must** uncomment the following # constant and define a short and easy to understand explanation as to why the # migration requires downtime. - DOWNTIME_REASON = 'Adding foreign keys' + DOWNTIME_REASON = '' # When using the methods "add_concurrent_index" or "add_column_with_default" # you must disable the use of transactions as these methods can not run in an @@ -20,23 +20,32 @@ class AddForeignKeysToTimelogs < ActiveRecord::Migration # # To disable transactions uncomment the following line and remove these # comments: - # disable_ddl_transaction! + disable_ddl_transaction! def up change_table :timelogs do |t| - t.references :issue, index: true, foreign_key: { on_delete: :cascade } - t.references :merge_request, index: true, foreign_key: { on_delete: :cascade } + t.column :issue_id, :integer + t.column :merge_request_id, :integer + end + + add_concurrent_index :timelogs, :issue_id + add_concurrent_index :timelogs, :merge_request_id + + if Gitlab::Database.postgresql? + execute <<-EOF + ALTER TABLE timelogs ADD CONSTRAINT "fk_timelogs_issues_issue_id" FOREIGN KEY (issue_id) REFERENCES "issues" (id) ON DELETE CASCADE NOT VALID; + ALTER TABLE timelogs ADD CONSTRAINT "fk_timelogs_merge_requests_merge_request_id" FOREIGN KEY (merge_request_id) REFERENCES "merge_requests" (id) ON DELETE CASCADE NOT VALID; + EOF + else + execute "ALTER TABLE timelogs ADD CONSTRAINT fk_timelogs_issues_issue_id FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;" + execute "ALTER TABLE timelogs ADD CONSTRAINT fk_timelogs_merge_requests_merge_request_id FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE;" end Timelog.where(trackable_type: 'Issue').update_all("issue_id = trackable_id") Timelog.where(trackable_type: 'MergeRequest').update_all("merge_request_id = trackable_id") - - remove_columns :timelogs, :trackable_id, :trackable_type end def down - add_reference :timelogs, :trackable, polymorphic: true, index: true - Timelog.where('issue_id IS NOT NULL').update_all("trackable_id = issue_id, trackable_type = 'Issue'") Timelog.where('merge_request_id IS NOT NULL').update_all("trackable_id = merge_request_id, trackable_type = 'MergeRequest'") |