From 5c828f39d8074c9f91e9034ddac860834fbc7177 Mon Sep 17 00:00:00 2001 From: John Cai Date: Tue, 4 Jun 2019 12:07:10 -0700 Subject: [PATCH] Fix null source_project_id in pool_repositories Due to a bug, some pool_repositories in production have a null source_project_id column. This migration aims to fix those rows. --- .../jc-migration-for-source-project-id.yml | 5 ++++ ...3_fix_pool_repository_source_project_id.rb | 19 ++++++++++++ ..._pool_repository_source_project_id_spec.rb | 29 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 changelogs/unreleased/jc-migration-for-source-project-id.yml create mode 100644 db/migrate/20190604184643_fix_pool_repository_source_project_id.rb create mode 100644 spec/migrations/fix_pool_repository_source_project_id_spec.rb diff --git a/changelogs/unreleased/jc-migration-for-source-project-id.yml b/changelogs/unreleased/jc-migration-for-source-project-id.yml new file mode 100644 index 00000000000..3e2e8ebfcc5 --- /dev/null +++ b/changelogs/unreleased/jc-migration-for-source-project-id.yml @@ -0,0 +1,5 @@ +--- +title: Fix null source_project_id in pool_repositories +merge_request: 29157 +author: +type: other diff --git a/db/migrate/20190604184643_fix_pool_repository_source_project_id.rb b/db/migrate/20190604184643_fix_pool_repository_source_project_id.rb new file mode 100644 index 00000000000..30244760e6b --- /dev/null +++ b/db/migrate/20190604184643_fix_pool_repository_source_project_id.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class FixPoolRepositorySourceProjectId < ActiveRecord::Migration[5.1] + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + def up + execute "UPDATE pool_repositories SET source_project_id = (SELECT MIN(id) FROM projects WHERE pool_repository_id = pool_repositories.id) WHERE pool_repositories.source_project_id IS NULL" + end + + def down + # nothing to do her + end +end diff --git a/spec/migrations/fix_pool_repository_source_project_id_spec.rb b/spec/migrations/fix_pool_repository_source_project_id_spec.rb new file mode 100644 index 00000000000..8ddee9bb575 --- /dev/null +++ b/spec/migrations/fix_pool_repository_source_project_id_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require 'spec_helper' +require Rails.root.join('db', 'migrate', '20190604184643_fix_pool_repository_source_project_id.rb') + +describe FixPoolRepositorySourceProjectId, :migration do + let(:projects) { table(:projects) } + let(:pool_repositories) { table(:pool_repositories) } + let(:shards) { table(:shards) } + + it 'fills in source_project_ids' do + shard = shards.create!(name: 'default') + + # gitaly is a project with a pool repository that has a source_project_id + gitaly = projects.create!(name: 'gitaly', path: 'gitlab-org/gitaly', namespace_id: 1) + pool_repository = pool_repositories.create(shard_id: shard.id, source_project_id: gitaly.id) + gitaly.update_column(:pool_repository_id, pool_repository.id) + + # gitlab is a project with a pool repository that's missing a source_project_id + pool_repository_without_source_project = pool_repositories.create(shard_id: shard.id, source_project_id: nil) + gitlab = projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1, pool_repository_id: pool_repository_without_source_project.id) + projects.create!(name: 'gitlab-fork-1', path: 'my-org-1/gitlab-ce', namespace_id: 1, pool_repository_id: pool_repository_without_source_project.id) + + migrate! + + expect(pool_repositories.find(pool_repository_without_source_project.id).source_project_id).to eq(gitlab.id) + expect(pool_repositories.find(pool_repository.id).source_project_id).to eq(gitaly.id) + end +end