Use batching to clear orphans in head_pipeline migration
This commit is contained in:
parent
4aab52b20f
commit
2deeac5643
|
@ -5,15 +5,24 @@ class AddForeignKeyToMergeRequests < ActiveRecord::Migration
|
|||
|
||||
disable_ddl_transaction!
|
||||
|
||||
class MergeRequest < ActiveRecord::Base
|
||||
self.table_name = 'merge_requests'
|
||||
include ::EachBatch
|
||||
end
|
||||
|
||||
def up
|
||||
execute <<-SQL.strip_heredoc
|
||||
UPDATE merge_requests SET head_pipeline_id = null
|
||||
WHERE NOT EXISTS (
|
||||
scope = <<-SQL.strip_heredoc
|
||||
head_pipeline_id IS NOT NULL
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM ci_pipelines
|
||||
WHERE ci_pipelines.id = merge_requests.head_pipeline_id
|
||||
)
|
||||
SQL
|
||||
|
||||
MergeRequest.where(scope).each_batch(of: 1000) do |merge_requests|
|
||||
merge_requests.update_all(head_pipeline_id: nil)
|
||||
end
|
||||
|
||||
unless foreign_key_exists?(:merge_requests, :head_pipeline_id)
|
||||
add_concurrent_foreign_key(:merge_requests, :ci_pipelines,
|
||||
column: :head_pipeline_id, on_delete: :nullify)
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
require 'spec_helper'
|
||||
require Rails.root.join('db', 'migrate', '20170713104829_add_foreign_key_to_merge_requests.rb')
|
||||
|
||||
describe AddForeignKeyToMergeRequests, :migration do
|
||||
let(:projects) { table(:projects) }
|
||||
let(:merge_requests) { table(:merge_requests) }
|
||||
let(:pipelines) { table(:ci_pipelines) }
|
||||
|
||||
before do
|
||||
projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce')
|
||||
pipelines.create!(project_id: projects.first.id,
|
||||
ref: 'some-branch',
|
||||
sha: 'abc12345')
|
||||
|
||||
# merge request without a pipeline
|
||||
create_merge_request(head_pipeline_id: nil)
|
||||
|
||||
# merge request with non-existent pipeline
|
||||
create_merge_request(head_pipeline_id: 1234)
|
||||
|
||||
# merge reqeust with existing pipeline assigned
|
||||
create_merge_request(head_pipeline_id: pipelines.first.id)
|
||||
end
|
||||
|
||||
it 'correctly adds a foreign key to head_pipeline_id' do
|
||||
migrate!
|
||||
|
||||
expect(merge_requests.first.head_pipeline_id).to be_nil
|
||||
expect(merge_requests.second.head_pipeline_id).to be_nil
|
||||
expect(merge_requests.third.head_pipeline_id).to eq pipelines.first.id
|
||||
end
|
||||
|
||||
def create_merge_request(**opts)
|
||||
merge_requests.create!(source_project_id: projects.first.id,
|
||||
target_project_id: projects.first.id,
|
||||
source_branch: 'some-branch',
|
||||
target_branch: 'master', **opts)
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue