Use stages position column to track stage index

This commit is contained in:
Grzegorz Bizon 2018-05-01 14:30:44 +02:00
parent b337a086d5
commit 0fd0b64be6
14 changed files with 27 additions and 27 deletions

View file

@ -17,7 +17,7 @@ module Ci
validates :project, presence: true
validates :pipeline, presence: true
validates :name, presence: true
validates :priority, presence: true
validates :position, presence: true
end
after_initialize do
@ -25,9 +25,9 @@ module Ci
end
before_validation unless: :importing? do
next if priority.present?
next if position.present?
self.priority = statuses.select(:stage_idx)
self.position = statuses.select(:stage_idx)
.where('stage_idx IS NOT NULL')
.group(:stage_idx)
.order('COUNT(*) DESC')

View file

@ -42,7 +42,7 @@ module Ci
def create_stage
Ci::Stage.create!(name: @build.stage,
priority: @build.stage_idx,
position: @build.stage_idx,
pipeline: @build.pipeline,
project: @build.project)
end

View file

@ -7,10 +7,10 @@ class AddTmpStagePriorityIndexToCiBuilds < ActiveRecord::Migration
def up
add_concurrent_index(:ci_builds, [:stage_id, :stage_idx],
where: 'stage_idx IS NOT NULL', name: 'tmp_build_stage_priority_index')
where: 'stage_idx IS NOT NULL', name: 'tmp_build_stage_position_index')
end
def down
remove_concurrent_index_by_name(:ci_builds, 'tmp_build_stage_priority_index')
remove_concurrent_index_by_name(:ci_builds, 'tmp_build_stage_position_index')
end
end

View file

@ -4,6 +4,6 @@ class AddIndexToCiStage < ActiveRecord::Migration
DOWNTIME = false
def change
add_column :ci_stages, :priority, :integer
add_column :ci_stages, :position, :integer
end
end

View file

@ -322,7 +322,7 @@ ActiveRecord::Schema.define(version: 20180425131009) do
add_index "ci_builds", ["project_id", "id"], name: "index_ci_builds_on_project_id_and_id", using: :btree
add_index "ci_builds", ["protected"], name: "index_ci_builds_on_protected", using: :btree
add_index "ci_builds", ["runner_id"], name: "index_ci_builds_on_runner_id", using: :btree
add_index "ci_builds", ["stage_id", "stage_idx"], name: "tmp_build_stage_priority_index", where: "(stage_idx IS NOT NULL)", using: :btree
add_index "ci_builds", ["stage_id", "stage_idx"], name: "tmp_build_stage_position_index", where: "(stage_idx IS NOT NULL)", using: :btree
add_index "ci_builds", ["stage_id"], name: "index_ci_builds_on_stage_id", using: :btree
add_index "ci_builds", ["status", "type", "runner_id"], name: "index_ci_builds_on_status_and_type_and_runner_id", using: :btree
add_index "ci_builds", ["status"], name: "index_ci_builds_on_status", using: :btree
@ -487,7 +487,7 @@ ActiveRecord::Schema.define(version: 20180425131009) do
t.string "name"
t.integer "status"
t.integer "lock_version"
t.integer "priority"
t.integer "position"
end
add_index "ci_stages", ["pipeline_id", "name"], name: "index_ci_stages_on_pipeline_id_and_name", unique: true, using: :btree

View file

@ -26,19 +26,19 @@ module Gitlab
FROM freqs
)
UPDATE ci_stages SET priority = indexes.index
UPDATE ci_stages SET position = indexes.index
FROM indexes WHERE indexes.stage_id = ci_stages.id
AND ci_stages.priority IS NULL;
AND ci_stages.position IS NULL;
SQL
else
<<~SQL
UPDATE ci_stages
SET priority =
SET position =
(SELECT stage_idx FROM ci_builds
WHERE ci_builds.stage_id = ci_stages.id
GROUP BY ci_builds.stage_idx ORDER BY COUNT(*) DESC LIMIT 1)
WHERE ci_stages.id BETWEEN #{start_id} AND #{stop_id}
AND ci_stages.priority IS NULL
AND ci_stages.position IS NULL
SQL
end
end

View file

@ -19,7 +19,7 @@ module Gitlab
def attributes
{ name: @attributes.fetch(:name),
priority: @attributes.fetch(:index),
position: @attributes.fetch(:index),
pipeline: @pipeline,
project: @pipeline.project }
end

View file

@ -21,7 +21,7 @@ FactoryBot.define do
pipeline factory: :ci_empty_pipeline
name 'test'
priority 1
position 1
status 'pending'
end
end

View file

@ -26,10 +26,10 @@ describe Gitlab::BackgroundMigration::MigrateStageIndex, :migration, schema: 201
end
it 'correctly migrates stages indices' do
expect(stages.all.pluck(:priority)).to all(be_nil)
expect(stages.all.pluck(:position)).to all(be_nil)
described_class.new.perform(100, 101)
expect(stages.all.pluck(:priority)).to eq [2, 3]
expect(stages.all.pluck(:position)).to eq [2, 3]
end
end

View file

@ -17,7 +17,7 @@ describe Gitlab::Ci::Pipeline::Chain::Create do
context 'when pipeline is ready to be saved' do
before do
pipeline.stages.build(name: 'test', priority: 0, project: project)
pipeline.stages.build(name: 'test', position: 0, project: project)
step.perform!
end

View file

@ -25,7 +25,7 @@ describe Gitlab::Ci::Pipeline::Seed::Stage do
it 'returns hash attributes of a stage' do
expect(subject.attributes).to be_a Hash
expect(subject.attributes)
.to include(:name, :priority, :pipeline, :project)
.to include(:name, :position, :pipeline, :project)
end
end

View file

@ -232,7 +232,7 @@ Ci::Stage:
- id
- name
- status
- priority
- position
- lock_version
- project_id
- pipeline_id

View file

@ -21,7 +21,7 @@ describe ScheduleStagesIndexMigration, :sidekiq, :migration do
it 'schedules delayed background migrations in batches' do
Sidekiq::Testing.fake! do
Timecop.freeze do
expect(stages.all).to all(have_attributes(priority: be_nil))
expect(stages.all).to all(have_attributes(position: be_nil))
migrate!

View file

@ -89,9 +89,9 @@ describe Ci::Stage, :models do
end
describe '#index' do
context 'when stage has been imported and does not have priority index set' do
context 'when stage has been imported and does not have position index set' do
before do
stage.update_column(:priority, nil)
stage.update_column(:position, nil)
end
context 'when stage has statuses' do
@ -100,21 +100,21 @@ describe Ci::Stage, :models do
end
it 'recalculates index before updating status' do
expect(stage.reload.priority).to be_nil
expect(stage.reload.position).to be_nil
stage.update_status
expect(stage.reload.priority).to eq 10
expect(stage.reload.position).to eq 10
end
end
context 'when stage does not have statuses' do
it 'fallbacks to zero' do
expect(stage.reload.priority).to be_nil
expect(stage.reload.position).to be_nil
stage.update_status
expect(stage.reload.priority).to eq 0
expect(stage.reload.position).to eq 0
end
end
end