Retry migration removing stages in case of duplicates
This commit is contained in:
parent
5f57c7a5a5
commit
b5c69ce3ab
|
@ -3,12 +3,15 @@ class RemoveRedundantPipelineStages < ActiveRecord::Migration
|
||||||
|
|
||||||
DOWNTIME = false
|
DOWNTIME = false
|
||||||
|
|
||||||
def up
|
disable_ddl_transaction!
|
||||||
remove_concurrent_index :ci_stages, [:pipeline_id, :name]
|
|
||||||
|
|
||||||
|
def up(attempts: 100)
|
||||||
|
remove_outdated_index!
|
||||||
remove_redundant_pipeline_stages!
|
remove_redundant_pipeline_stages!
|
||||||
|
add_unique_index!
|
||||||
add_concurrent_index :ci_stages, [:pipeline_id, :name], unique: true
|
rescue ActiveRecord::RecordNotUnique
|
||||||
|
retry if (attempts -= 1) > 0
|
||||||
|
raise
|
||||||
end
|
end
|
||||||
|
|
||||||
def down
|
def down
|
||||||
|
@ -18,6 +21,16 @@ class RemoveRedundantPipelineStages < ActiveRecord::Migration
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def remove_outdated_index!
|
||||||
|
return unless index_exists?(:ci_stages, [:pipeline_id, :name])
|
||||||
|
|
||||||
|
remove_concurrent_index :ci_stages, [:pipeline_id, :name]
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_unique_index!
|
||||||
|
add_concurrent_index :ci_stages, [:pipeline_id, :name], unique: true
|
||||||
|
end
|
||||||
|
|
||||||
def remove_redundant_pipeline_stages!
|
def remove_redundant_pipeline_stages!
|
||||||
redundant_stages_ids = <<~SQL
|
redundant_stages_ids = <<~SQL
|
||||||
SELECT id FROM ci_stages WHERE (pipeline_id, name) IN (
|
SELECT id FROM ci_stages WHERE (pipeline_id, name) IN (
|
||||||
|
|
|
@ -36,4 +36,13 @@ describe RemoveRedundantPipelineStages, :migration do
|
||||||
expect(builds.all.count).to eq 6
|
expect(builds.all.count).to eq 6
|
||||||
expect(builds.all.pluck(:stage_id).compact).to eq [102]
|
expect(builds.all.pluck(:stage_id).compact).to eq [102]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'retries when duplicated stages are being created during migration' do
|
||||||
|
allow(subject).to receive(:remove_outdated_index!)
|
||||||
|
expect(subject).to receive(:remove_redundant_pipeline_stages!).exactly(3).times
|
||||||
|
allow(subject).to receive(:add_unique_index!)
|
||||||
|
.and_raise(ActiveRecord::RecordNotUnique.new('Duplicated stages present!'))
|
||||||
|
|
||||||
|
expect { subject.up(attempts: 3) }.to raise_error ActiveRecord::RecordNotUnique
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue