diff options
author | Yorick Peterse <yorickpeterse@gmail.com> | 2018-07-02 15:38:05 +0200 |
---|---|---|
committer | Yorick Peterse <yorickpeterse@gmail.com> | 2018-07-25 14:23:35 +0200 |
commit | 995588ad627e9c97c1ebb1124a8c24d2fd117313 (patch) | |
tree | 1a7e23c43a02cf006bd19fd66053412b9e4dccda /db | |
parent | f7084577bf2d424d3f87e6b7780311026a6097ef (diff) | |
download | gitlab-ce-995588ad627e9c97c1ebb1124a8c24d2fd117313.tar.gz |
Remove orphaned routes
This removes all orphaned project and namespace routes from the "routes"
table. This is in as a preparation step for removing dynamic route
generation, as discussed in
https://gitlab.com/gitlab-org/gitlab-ce/issues/44390.
Diffstat (limited to 'db')
-rw-r--r-- | db/migrate/20180702124358_remove_orphaned_routes.rb | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/db/migrate/20180702124358_remove_orphaned_routes.rb b/db/migrate/20180702124358_remove_orphaned_routes.rb new file mode 100644 index 00000000000..6f6e289ba87 --- /dev/null +++ b/db/migrate/20180702124358_remove_orphaned_routes.rb @@ -0,0 +1,49 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class RemoveOrphanedRoutes < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + class Route < ActiveRecord::Base + self.table_name = 'routes' + include EachBatch + + def self.orphaned_namespace_routes + where(source_type: 'Namespace') + .where('NOT EXISTS ( SELECT 1 FROM namespaces WHERE namespaces.id = routes.source_id )') + end + + def self.orphaned_project_routes + where(source_type: 'Project') + .where('NOT EXISTS ( SELECT 1 FROM projects WHERE projects.id = routes.source_id )') + end + end + + def up + # Some of these queries can take up to 10 seconds to run on GitLab.com, + # which is pretty close to our 15 second statement timeout. To ensure a + # smooth deployment procedure we disable the statement timeouts for this + # migration, just in case. + disable_statement_timeout + + # On GitLab.com there are around 4000 orphaned project routes, and around + # 150 orphaned namespace routes. + [ + Route.orphaned_project_routes, + Route.orphaned_namespace_routes + ].each do |relation| + relation.each_batch(of: 1_000) do |batch| + batch.delete_all + end + end + end + + def down + # There is no way to restore orphaned routes, and this doesn't make any + # sense anyway. + end +end |