Commit 0fd0b64b authored by Grzegorz Bizon's avatar Grzegorz Bizon

Use stages position column to track stage index

parent b337a086
......@@ -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')
......
......@@ -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
......
......@@ -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
......@@ -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
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -21,7 +21,7 @@ FactoryBot.define do
pipeline factory: :ci_empty_pipeline
name 'test'
priority 1
position 1
status 'pending'
end
end
......@@ -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
......@@ -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
......
......@@ -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
......
......@@ -232,7 +232,7 @@ Ci::Stage:
- id
- name
- status
- priority
- position
- lock_version
- project_id
- pipeline_id
......
......@@ -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!
......
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment