diff options
Diffstat (limited to 'app/services/ci/queue')
-rw-r--r-- | app/services/ci/queue/build_queue_service.rb | 26 | ||||
-rw-r--r-- | app/services/ci/queue/builds_table_strategy.rb | 75 | ||||
-rw-r--r-- | app/services/ci/queue/pending_builds_strategy.rb | 27 |
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) |