summaryrefslogtreecommitdiff
path: root/app/services/ci/queue
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/ci/queue')
-rw-r--r--app/services/ci/queue/build_queue_service.rb26
-rw-r--r--app/services/ci/queue/builds_table_strategy.rb75
-rw-r--r--app/services/ci/queue/pending_builds_strategy.rb27
3 files changed, 5 insertions, 123 deletions
diff --git a/app/services/ci/queue/build_queue_service.rb b/app/services/ci/queue/build_queue_service.rb
index fefbdb151ec..2deebc1d725 100644
--- a/app/services/ci/queue/build_queue_service.rb
+++ b/app/services/ci/queue/build_queue_service.rb
@@ -24,25 +24,7 @@ module Ci
# rubocop:disable CodeReuse/ActiveRecord
def builds_for_group_runner
- if strategy.use_denormalized_data_strategy?
- strategy.builds_for_group_runner
- else
- # Workaround for weird Rails bug, that makes `runner.groups.to_sql` to return `runner_id = NULL`
- groups = ::Group.joins(:runner_namespaces).merge(runner.runner_namespaces)
-
- hierarchy_groups = Gitlab::ObjectHierarchy
- .new(groups)
- .base_and_descendants
-
- projects = Project.where(namespace_id: hierarchy_groups)
- .with_group_runners_enabled
- .with_builds_enabled
- .without_deleted
-
- relation = new_builds.where(project: projects)
-
- order(relation)
- end
+ strategy.builds_for_group_runner
end
def builds_for_project_runner
@@ -80,11 +62,7 @@ module Ci
def strategy
strong_memoize(:strategy) do
- if ::Feature.enabled?(:ci_pending_builds_queue_source, runner)
- Queue::PendingBuildsStrategy.new(runner)
- else
- Queue::BuildsTableStrategy.new(runner)
- end
+ Queue::PendingBuildsStrategy.new(runner)
end
end
diff --git a/app/services/ci/queue/builds_table_strategy.rb b/app/services/ci/queue/builds_table_strategy.rb
deleted file mode 100644
index c27c10bd18d..00000000000
--- a/app/services/ci/queue/builds_table_strategy.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# frozen_string_literal: true
-
-module Ci
- module Queue
- class BuildsTableStrategy
- attr_reader :runner
-
- def initialize(runner)
- @runner = runner
- end
-
- # rubocop:disable CodeReuse/ActiveRecord
- def builds_for_shared_runner
- relation = new_builds
- # don't run projects which have not enabled shared runners and builds
- .joins('INNER JOIN projects ON ci_builds.project_id = projects.id')
- .where(projects: { shared_runners_enabled: true, pending_delete: false })
- .joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id')
- .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0')
-
- if Feature.enabled?(:ci_queueing_disaster_recovery_disable_fair_scheduling, runner, type: :ops)
- # if disaster recovery is enabled, we fallback to FIFO scheduling
- relation.order('ci_builds.id ASC')
- else
- # Implement fair scheduling
- # this returns builds that are ordered by number of running builds
- # we prefer projects that don't use shared runners at all
- relation
- .joins("LEFT JOIN (#{running_builds_for_shared_runners.to_sql}) AS project_builds ON ci_builds.project_id = project_builds.project_id")
- .order(Arel.sql('COALESCE(project_builds.running_builds, 0) ASC'), 'ci_builds.id ASC')
- end
- end
-
- def builds_for_group_runner
- raise NotImplementedError
- end
-
- def builds_matching_tag_ids(relation, ids)
- # pick builds that does not have other tags than runner's one
- relation.matches_tag_ids(ids)
- end
-
- def builds_with_any_tags(relation)
- # pick builds that have at least one tag
- relation.with_any_tags
- end
-
- def order(relation)
- relation.order('id ASC')
- end
-
- def new_builds
- ::Ci::Build.pending.unstarted
- end
-
- def build_ids(relation)
- relation.pluck(:id)
- end
-
- def use_denormalized_data_strategy?
- false
- end
-
- private
-
- def running_builds_for_shared_runners
- ::Ci::Build.running
- .where(runner: ::Ci::Runner.instance_type)
- .group(:project_id)
- .select(:project_id, 'COUNT(*) AS running_builds')
- end
- # rubocop:enable CodeReuse/ActiveRecord
- end
- end
-end
diff --git a/app/services/ci/queue/pending_builds_strategy.rb b/app/services/ci/queue/pending_builds_strategy.rb
index f2eba0681db..c8bdbba5e65 100644
--- a/app/services/ci/queue/pending_builds_strategy.rb
+++ b/app/services/ci/queue/pending_builds_strategy.rb
@@ -23,19 +23,11 @@ module Ci
end
def builds_matching_tag_ids(relation, ids)
- if use_denormalized_data_strategy?
- relation.for_tags(runner.tags_ids)
- else
- relation.merge(CommitStatus.matches_tag_ids(ids, table: 'ci_pending_builds', column: 'build_id'))
- end
+ relation.for_tags(runner.tags_ids)
end
def builds_with_any_tags(relation)
- if use_denormalized_data_strategy?
- relation.where('cardinality(tag_ids) > 0')
- else
- relation.merge(CommitStatus.with_any_tags(table: 'ci_pending_builds', column: 'build_id'))
- end
+ relation.where('cardinality(tag_ids) > 0')
end
def order(relation)
@@ -50,23 +42,10 @@ module Ci
relation.pluck(:build_id)
end
- def use_denormalized_data_strategy?
- ::Feature.enabled?(:ci_queuing_use_denormalized_data_strategy)
- end
-
private
def builds_available_for_shared_runners
- if use_denormalized_data_strategy?
- new_builds.with_instance_runners
- else
- new_builds
- # don't run projects which have not enabled shared runners and builds
- .joins('INNER JOIN projects ON ci_pending_builds.project_id = projects.id')
- .where(projects: { shared_runners_enabled: true, pending_delete: false })
- .joins('LEFT JOIN project_features ON ci_pending_builds.project_id = project_features.project_id')
- .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0')
- end
+ new_builds.with_instance_runners
end
def builds_ordered_for_shared_runners(relation)