Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
85a98fd4
Commit
85a98fd4
authored
Feb 07, 2017
by
Ruben Davila
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor migration to not require downtime
parent
bdc93224
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
76 additions
and
12 deletions
+76
-12
db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb
db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb
+18
-9
db/post_migrate/20170206101007_remove_trackable_columns_from_timelogs.rb
.../20170206101007_remove_trackable_columns_from_timelogs.rb
+23
-0
db/post_migrate/20170206101030_validate_foreign_keys_on_timelogs.rb
...grate/20170206101030_validate_foreign_keys_on_timelogs.rb
+32
-0
db/schema.rb
db/schema.rb
+3
-3
No files found.
db/migrate/20170124174637_add_foreign_keys_to_timelogs.rb
View file @
85a98fd4
...
@@ -5,11 +5,11 @@ class AddForeignKeysToTimelogs < ActiveRecord::Migration
...
@@ -5,11 +5,11 @@ class AddForeignKeysToTimelogs < ActiveRecord::Migration
include
Gitlab
::
Database
::
MigrationHelpers
include
Gitlab
::
Database
::
MigrationHelpers
# Set this constant to true if this migration requires downtime.
# Set this constant to true if this migration requires downtime.
DOWNTIME
=
tru
e
DOWNTIME
=
fals
e
# When a migration requires downtime you **must** uncomment the following
# When a migration requires downtime you **must** uncomment the following
# constant and define a short and easy to understand explanation as to why the
# constant and define a short and easy to understand explanation as to why the
# migration requires downtime.
# migration requires downtime.
DOWNTIME_REASON
=
'
Adding foreign keys
'
DOWNTIME_REASON
=
''
# When using the methods "add_concurrent_index" or "add_column_with_default"
# 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
# you must disable the use of transactions as these methods can not run in an
...
@@ -20,23 +20,32 @@ class AddForeignKeysToTimelogs < ActiveRecord::Migration
...
@@ -20,23 +20,32 @@ class AddForeignKeysToTimelogs < ActiveRecord::Migration
#
#
# To disable transactions uncomment the following line and remove these
# To disable transactions uncomment the following line and remove these
# comments:
# comments:
#
disable_ddl_transaction!
disable_ddl_transaction!
def
up
def
up
change_table
:timelogs
do
|
t
|
change_table
:timelogs
do
|
t
|
t
.
references
:issue
,
index:
true
,
foreign_key:
{
on_delete: :cascade
}
t
.
column
:issue_id
,
:integer
t
.
references
:merge_request
,
index:
true
,
foreign_key:
{
on_delete: :cascade
}
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
end
Timelog
.
where
(
trackable_type:
'Issue'
).
update_all
(
"issue_id = trackable_id"
)
Timelog
.
where
(
trackable_type:
'Issue'
).
update_all
(
"issue_id = trackable_id"
)
Timelog
.
where
(
trackable_type:
'MergeRequest'
).
update_all
(
"merge_request_id = trackable_id"
)
Timelog
.
where
(
trackable_type:
'MergeRequest'
).
update_all
(
"merge_request_id = trackable_id"
)
remove_columns
:timelogs
,
:trackable_id
,
:trackable_type
end
end
def
down
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
(
'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'"
)
Timelog
.
where
(
'merge_request_id IS NOT NULL'
).
update_all
(
"trackable_id = merge_request_id, trackable_type = 'MergeRequest'"
)
...
...
db/post_migrate/20170206101007_remove_trackable_columns_from_timelogs.rb
0 → 100644
View file @
85a98fd4
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class
RemoveTrackableColumnsFromTimelogs
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
DOWNTIME
=
false
# 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
# existing transaction. When using "add_concurrent_index" make sure that this
# method is the _only_ method called in the migration, any other changes
# should go in a separate migration. This ensures that upon failure _only_ the
# index creation fails and can be retried or reverted easily.
#
# To disable transactions uncomment the following line and remove these
# comments:
# disable_ddl_transaction!
def
change
remove_columns
:timelogs
,
:trackable_id
,
:trackable_type
end
end
db/post_migrate/20170206101030_validate_foreign_keys_on_timelogs.rb
0 → 100644
View file @
85a98fd4
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class
ValidateForeignKeysOnTimelogs
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
DOWNTIME
=
false
# 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
# existing transaction. When using "add_concurrent_index" make sure that this
# method is the _only_ method called in the migration, any other changes
# should go in a separate migration. This ensures that upon failure _only_ the
# index creation fails and can be retried or reverted easily.
#
# To disable transactions uncomment the following line and remove these
# comments:
disable_ddl_transaction!
def
up
if
Gitlab
::
Database
.
postgresql?
execute
<<-
EOF
ALTER TABLE timelogs VALIDATE CONSTRAINT "fk_timelogs_issues_issue_id";
ALTER TABLE timelogs VALIDATE CONSTRAINT "fk_timelogs_merge_requests_merge_request_id";
EOF
end
end
def
down
# noop
end
end
db/schema.rb
View file @
85a98fd4
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
#
#
# It's strongly recommended that you check this file into your version control system.
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
20170206
071414
)
do
ActiveRecord
::
Schema
.
define
(
version:
20170206
101030
)
do
# These are extensions that must be enabled in order to support this database
# These are extensions that must be enabled in order to support this database
enable_extension
"plpgsql"
enable_extension
"plpgsql"
...
@@ -1341,8 +1341,8 @@ ActiveRecord::Schema.define(version: 20170206071414) do
...
@@ -1341,8 +1341,8 @@ ActiveRecord::Schema.define(version: 20170206071414) do
add_foreign_key
"protected_branch_merge_access_levels"
,
"protected_branches"
add_foreign_key
"protected_branch_merge_access_levels"
,
"protected_branches"
add_foreign_key
"protected_branch_push_access_levels"
,
"protected_branches"
add_foreign_key
"protected_branch_push_access_levels"
,
"protected_branches"
add_foreign_key
"subscriptions"
,
"projects"
,
on_delete: :cascade
add_foreign_key
"subscriptions"
,
"projects"
,
on_delete: :cascade
add_foreign_key
"timelogs"
,
"issues"
,
on_delete: :cascade
add_foreign_key
"timelogs"
,
"issues"
,
name:
"fk_timelogs_issues_issue_id"
,
on_delete: :cascade
add_foreign_key
"timelogs"
,
"merge_requests"
,
on_delete: :cascade
add_foreign_key
"timelogs"
,
"merge_requests"
,
name:
"fk_timelogs_merge_requests_merge_request_id"
,
on_delete: :cascade
add_foreign_key
"trending_projects"
,
"projects"
,
on_delete: :cascade
add_foreign_key
"trending_projects"
,
"projects"
,
on_delete: :cascade
add_foreign_key
"u2f_registrations"
,
"users"
add_foreign_key
"u2f_registrations"
,
"users"
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment