summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Cai <jcai@gitlab.com>2019-06-04 12:07:10 -0700
committerJohn Cai <jcai@gitlab.com>2019-06-11 09:00:04 -0700
commit5c828f39d8074c9f91e9034ddac860834fbc7177 (patch)
treefcacc536e216463944a02d22c4a096bb4de595fc
parent2e1c7573d5b5c0ffc521e8c622ac99a77b7c5007 (diff)
downloadgitlab-ce-jc-migration-for-source-project-id.tar.gz
Fix null source_project_id in pool_repositoriesjc-migration-for-source-project-id
Due to a bug, some pool_repositories in production have a null source_project_id column. This migration aims to fix those rows.
-rw-r--r--changelogs/unreleased/jc-migration-for-source-project-id.yml5
-rw-r--r--db/migrate/20190604184643_fix_pool_repository_source_project_id.rb19
-rw-r--r--spec/migrations/fix_pool_repository_source_project_id_spec.rb29
3 files changed, 53 insertions, 0 deletions
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