Skip to content

Fix conflict on the migration that adds routes for orphaned projects

What does this MR do?

A regression has been reported on at least one environment when the db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb post-migration runs:

  * bash[migrate gitlab-rails database] action run
    [execute] rake aborted!
              StandardError: An error has occurred, this and all later migrations canceled:

              PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_routes_on_path"
              DETAIL:  Key (path)=(ghost) already exists.
              /opt/gitlab/embedded/service/gitlab-rails/db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb:78:in `ensure_route!'
              /opt/gitlab/embedded/service/gitlab-rails/db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb:163:in `up'
              /opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:49:in `block (3 levels) in <top (required)>'
              /opt/gitlab/embedded/bin/bundle:23:in `load'
              /opt/gitlab/embedded/bin/bundle:23:in `<main>'

              Caused by:
              ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_routes_on_path"
              DETAIL:  Key (path)=(ghost) already exists.
              /opt/gitlab/embedded/service/gitlab-rails/db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb:78:in `ensure_route!'
              /opt/gitlab/embedded/service/gitlab-rails/db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb:163:in `up'
              /opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:49:in `block (3 levels) in <top (required)>'
              /opt/gitlab/embedded/bin/bundle:23:in `load'
              /opt/gitlab/embedded/bin/bundle:23:in `<main>'

              Caused by:
              PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_routes_on_path"
              DETAIL:  Key (path)=(ghost) already exists.
              /opt/gitlab/embedded/service/gitlab-rails/db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb:78:in `ensure_route!'
              /opt/gitlab/embedded/service/gitlab-rails/db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb:163:in `up'
              /opt/gitlab/embedded/service/gitlab-rails/lib/tasks/gitlab/db.rake:49:in `block (3 levels) in <top (required)>'
              /opt/gitlab/embedded/bin/bundle:23:in `load'
              /opt/gitlab/embedded/bin/bundle:23:in `<main>'
              Tasks: TOP => db:migrate
              (See full trace by running task with --trace)
              == 20200602143020 UpdateRoutesForLostAndFoundGroupAndOrphanedProjects: migrating

(For reference, this migration was introduced with !34285 (merged))

Root Cause

We have identified that this issue can occur in instances with an existing route with a path = 'ghost'

Way to reproduce in a local dev environment:

$ bundle exec rake dev:setup RAILS_ENV=development

$ gdk psql

 DELETE from schema_migrations where version='20200511080113';
 DELETE from schema_migrations where version='20200511083541';
 DELETE from schema_migrations where version='20200511220023';
 DELETE from schema_migrations where version='20200602143020';
 ALTER TABLE projects DROP CONSTRAINT fk_projects_namespace_id;

 UPDATE projects 
 SET namespace_id = 999999, 
 archived = TRUE, visibility_level = 0,
 name = name,
 path = path
 where path like '%gitlab-test%' and id = 1;
 UPDATE routes SET path = 'ghost' WHERE path = 'h5bp';

 \q

$ bundle exec rake db:migrate

== 20200602143020 UpdateRoutesForLostAndFoundGroupAndOrphanedProjects: migrating
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_routes_on_path"
DETAIL:  Key (path)=(ghost) already exists.

Solution

Update the db/post_migrate/20200602143020_update_routes_for_lost_and_found_group_and_orphaned_projects.rb post-migration to ensure that unique path is generated for the Ghost namespace.

If a new path is chosen (i.e. the existing path was conflicting), also update the Ghost user's username.

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:

  • [-] Label as security and @ mention @gitlab-com/gl-security/appsec
  • [-] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • [-] Security reports checked/validated by a reviewer from the AppSec team

Related Issue: #224674 (closed)

Merge request reports