diff options
Diffstat (limited to 'app/services/ci')
-rw-r--r-- | app/services/ci/create_pipeline_service.rb | 40 | ||||
-rw-r--r-- | app/services/ci/expire_pipeline_cache_service.rb | 27 | ||||
-rw-r--r-- | app/services/ci/job_artifacts/destroy_all_expired_service.rb | 40 | ||||
-rw-r--r-- | app/services/ci/parse_dotenv_artifact_service.rb | 8 | ||||
-rw-r--r-- | app/services/ci/pipeline_processing/atomic_processing_service.rb | 4 | ||||
-rw-r--r-- | app/services/ci/play_build_service.rb | 2 | ||||
-rw-r--r-- | app/services/ci/process_sync_events_service.rb | 58 | ||||
-rw-r--r-- | app/services/ci/queue/build_queue_service.rb | 10 | ||||
-rw-r--r-- | app/services/ci/queue/builds_table_strategy.rb | 10 | ||||
-rw-r--r-- | app/services/ci/queue/pending_builds_strategy.rb | 18 | ||||
-rw-r--r-- | app/services/ci/register_job_service.rb | 9 | ||||
-rw-r--r-- | app/services/ci/retry_build_service.rb | 38 | ||||
-rw-r--r-- | app/services/ci/stuck_builds/drop_pending_service.rb | 11 | ||||
-rw-r--r-- | app/services/ci/update_build_queue_service.rb | 12 | ||||
-rw-r--r-- | app/services/ci/update_build_state_service.rb | 5 | ||||
-rw-r--r-- | app/services/ci/update_pending_build_service.rb | 4 |
16 files changed, 219 insertions, 77 deletions
diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 540e8f7b970..c1f35afba40 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -2,10 +2,14 @@ module Ci class CreatePipelineService < BaseService - attr_reader :pipeline + attr_reader :pipeline, :logger CreateError = Class.new(StandardError) + LOG_MAX_DURATION_THRESHOLD = 3.seconds + LOG_MAX_PIPELINE_SIZE = 2_000 + LOG_MAX_CREATION_THRESHOLD = 20.seconds + SEQUENCE = [Gitlab::Ci::Pipeline::Chain::Build, Gitlab::Ci::Pipeline::Chain::Build::Associations, Gitlab::Ci::Pipeline::Chain::Validate::Abilities, @@ -24,7 +28,10 @@ module Ci Gitlab::Ci::Pipeline::Chain::Validate::External, Gitlab::Ci::Pipeline::Chain::Populate, Gitlab::Ci::Pipeline::Chain::StopDryRun, + Gitlab::Ci::Pipeline::Chain::EnsureEnvironments, + Gitlab::Ci::Pipeline::Chain::EnsureResourceGroups, Gitlab::Ci::Pipeline::Chain::Create, + Gitlab::Ci::Pipeline::Chain::CreateDeployments, Gitlab::Ci::Pipeline::Chain::CreateCrossDatabaseAssociations, Gitlab::Ci::Pipeline::Chain::Limit::Activity, Gitlab::Ci::Pipeline::Chain::Limit::JobActivity, @@ -53,6 +60,7 @@ module Ci # @return [Ci::Pipeline] The created Ci::Pipeline object. # rubocop: disable Metrics/ParameterLists def execute(source, ignore_skip_ci: false, save_on_errors: true, trigger_request: nil, schedule: nil, merge_request: nil, external_pull_request: nil, bridge: nil, **options, &block) + @logger = build_logger @pipeline = Ci::Pipeline.new command = Gitlab::Ci::Pipeline::Chain::Command.new( @@ -76,6 +84,7 @@ module Ci push_options: params[:push_options] || {}, chat_data: params[:chat_data], bridge: bridge, + logger: @logger, **extra_options(**options)) # Ensure we never persist the pipeline when dry_run: true @@ -98,6 +107,9 @@ module Ci else ServiceResponse.success(payload: pipeline) end + + ensure + @logger.commit(pipeline: pipeline, caller: self.class.name) end # rubocop: enable Metrics/ParameterLists @@ -135,6 +147,32 @@ module Ci def extra_options(content: nil, dry_run: false) { content: content, dry_run: dry_run } end + + def build_logger + Gitlab::Ci::Pipeline::Logger.new(project: project) do |l| + l.log_when do |observations| + observations.any? do |name, values| + values.any? && + name.to_s.end_with?('duration_s') && + values.max >= LOG_MAX_DURATION_THRESHOLD + end + end + + l.log_when do |observations| + values = observations['pipeline_size_count'] + next false if values.empty? + + values.max >= LOG_MAX_PIPELINE_SIZE + end + + l.log_when do |observations| + values = observations['pipeline_creation_duration_s'] + next false if values.empty? + + values.max >= LOG_MAX_CREATION_THRESHOLD + end + end + end end end diff --git a/app/services/ci/expire_pipeline_cache_service.rb b/app/services/ci/expire_pipeline_cache_service.rb index 48a6344f576..8622b1a5863 100644 --- a/app/services/ci/expire_pipeline_cache_service.rb +++ b/app/services/ci/expire_pipeline_cache_service.rb @@ -60,6 +60,10 @@ module Ci url_helpers.graphql_etag_pipeline_sha_path(sha) end + def graphql_project_on_demand_scan_counts_path(project) + url_helpers.graphql_etag_project_on_demand_scan_counts_path(project) + end + # Updates ETag caches of a pipeline. # # This logic resides in a separate method so that EE can more easily extend @@ -70,18 +74,25 @@ module Ci def update_etag_cache(pipeline, store) project = pipeline.project - store.touch(project_pipelines_path(project)) - store.touch(commit_pipelines_path(project, pipeline.commit)) unless pipeline.commit.nil? - store.touch(new_merge_request_pipelines_path(project)) + etag_paths = [ + project_pipelines_path(project), + new_merge_request_pipelines_path(project), + graphql_project_on_demand_scan_counts_path(project) + ] + + etag_paths << commit_pipelines_path(project, pipeline.commit) unless pipeline.commit.nil? + each_pipelines_merge_request_path(pipeline) do |path| - store.touch(path) + etag_paths << path end - pipeline.self_with_upstreams_and_downstreams.each do |relative_pipeline| - store.touch(project_pipeline_path(relative_pipeline.project, relative_pipeline)) - store.touch(graphql_pipeline_path(relative_pipeline)) - store.touch(graphql_pipeline_sha_path(relative_pipeline.sha)) + pipeline.self_with_upstreams_and_downstreams.includes(project: [:route, { namespace: :route }]).each do |relative_pipeline| # rubocop: disable CodeReuse/ActiveRecord + etag_paths << project_pipeline_path(relative_pipeline.project, relative_pipeline) + etag_paths << graphql_pipeline_path(relative_pipeline) + etag_paths << graphql_pipeline_sha_path(relative_pipeline.sha) end + + store.touch(*etag_paths) end def url_helpers diff --git a/app/services/ci/job_artifacts/destroy_all_expired_service.rb b/app/services/ci/job_artifacts/destroy_all_expired_service.rb index e4f65736a58..7fa56677a0c 100644 --- a/app/services/ci/job_artifacts/destroy_all_expired_service.rb +++ b/app/services/ci/job_artifacts/destroy_all_expired_service.rb @@ -14,6 +14,7 @@ module Ci def initialize @removed_artifacts_count = 0 + @start_at = Time.current end ## @@ -25,9 +26,9 @@ module Ci def execute in_lock(EXCLUSIVE_LOCK_KEY, ttl: LOCK_TIMEOUT, retries: 1) do if ::Feature.enabled?(:ci_destroy_unlocked_job_artifacts) - destroy_unlocked_job_artifacts(Time.current) + destroy_unlocked_job_artifacts else - destroy_job_artifacts_with_slow_iteration(Time.current) + destroy_job_artifacts_with_slow_iteration end end @@ -36,16 +37,37 @@ module Ci private - def destroy_unlocked_job_artifacts(start_at) + def destroy_unlocked_job_artifacts loop_until(timeout: LOOP_TIMEOUT, limit: LOOP_LIMIT) do - artifacts = Ci::JobArtifact.expired_before(start_at).artifact_unlocked.limit(BATCH_SIZE) + artifacts = Ci::JobArtifact.expired_before(@start_at).artifact_unlocked.limit(BATCH_SIZE) service_response = destroy_batch(artifacts) @removed_artifacts_count += service_response[:destroyed_artifacts_count] + + update_locked_status_on_unknown_artifacts if service_response[:destroyed_artifacts_count] == 0 + + # Return a truthy value here to prevent exiting #loop_until + @removed_artifacts_count end end - def destroy_job_artifacts_with_slow_iteration(start_at) - Ci::JobArtifact.expired_before(start_at).each_batch(of: BATCH_SIZE, column: :expire_at, order: :desc) do |relation, index| + def update_locked_status_on_unknown_artifacts + build_ids = Ci::JobArtifact.expired_before(@start_at).artifact_unknown.limit(BATCH_SIZE).distinct_job_ids + + return unless build_ids.present? + + locked_pipeline_build_ids = ::Ci::Build.with_pipeline_locked_artifacts.id_in(build_ids).pluck_primary_key + unlocked_pipeline_build_ids = build_ids - locked_pipeline_build_ids + + update_unknown_artifacts(locked_pipeline_build_ids, Ci::JobArtifact.lockeds[:artifacts_locked]) + update_unknown_artifacts(unlocked_pipeline_build_ids, Ci::JobArtifact.lockeds[:unlocked]) + end + + def update_unknown_artifacts(build_ids, locked_value) + Ci::JobArtifact.for_job_ids(build_ids).update_all(locked: locked_value) if build_ids.any? + end + + def destroy_job_artifacts_with_slow_iteration + Ci::JobArtifact.expired_before(@start_at).each_batch(of: BATCH_SIZE, column: :expire_at, order: :desc) do |relation, index| # For performance reasons, join with ci_pipelines after the batch is queried. # See: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/47496 artifacts = relation.unlocked @@ -53,7 +75,7 @@ module Ci service_response = destroy_batch(artifacts) @removed_artifacts_count += service_response[:destroyed_artifacts_count] - break if loop_timeout?(start_at) + break if loop_timeout? break if index >= LOOP_LIMIT end end @@ -62,8 +84,8 @@ module Ci Ci::JobArtifacts::DestroyBatchService.new(artifacts).execute end - def loop_timeout?(start_at) - Time.current > start_at + LOOP_TIMEOUT + def loop_timeout? + Time.current > @start_at + LOOP_TIMEOUT end end end diff --git a/app/services/ci/parse_dotenv_artifact_service.rb b/app/services/ci/parse_dotenv_artifact_service.rb index 725ecbcce5d..40e2cd82b4f 100644 --- a/app/services/ci/parse_dotenv_artifact_service.rb +++ b/app/services/ci/parse_dotenv_artifact_service.rb @@ -14,7 +14,7 @@ module Ci Ci::JobVariable.bulk_insert!(variables) success - rescue SizeLimitError, ParserError, ActiveRecord::RecordInvalid => error + rescue SizeLimitError, ParserError, ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique => error Gitlab::ErrorTracking.track_exception(error, job_id: artifact.job_id) error(error.message, :bad_request) end @@ -33,13 +33,13 @@ module Ci end def parse!(artifact) - variables = [] + variables = {} artifact.each_blob do |blob| blob.each_line do |line| key, value = scan_line!(line) - variables << Ci::JobVariable.new(job_id: artifact.job_id, + variables[key] = Ci::JobVariable.new(job_id: artifact.job_id, source: :dotenv, key: key, value: value) end end @@ -49,7 +49,7 @@ module Ci "Dotenv files cannot have more than #{dotenv_variable_limit} variables" end - variables + variables.values end def scan_line!(line) diff --git a/app/services/ci/pipeline_processing/atomic_processing_service.rb b/app/services/ci/pipeline_processing/atomic_processing_service.rb index 236d660d829..d8ce063ffb4 100644 --- a/app/services/ci/pipeline_processing/atomic_processing_service.rb +++ b/app/services/ci/pipeline_processing/atomic_processing_service.rb @@ -36,6 +36,10 @@ module Ci update_pipeline! update_statuses_processed! + if Feature.enabled?(:expire_job_and_pipeline_cache_synchronously, pipeline.project, default_enabled: :yaml) + Ci::ExpirePipelineCacheService.new.execute(pipeline) + end + true end diff --git a/app/services/ci/play_build_service.rb b/app/services/ci/play_build_service.rb index c1cf06a4631..e2673c763f3 100644 --- a/app/services/ci/play_build_service.rb +++ b/app/services/ci/play_build_service.rb @@ -9,7 +9,7 @@ module Ci # if build.enqueue build.tap do |build| - build.update(user: current_user, job_variables_attributes: job_variables_attributes || []) + build.update!(user: current_user, job_variables_attributes: job_variables_attributes || []) AfterRequeueJobService.new(project, current_user).execute(build) end diff --git a/app/services/ci/process_sync_events_service.rb b/app/services/ci/process_sync_events_service.rb new file mode 100644 index 00000000000..6be8c41dc6a --- /dev/null +++ b/app/services/ci/process_sync_events_service.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +module Ci + class ProcessSyncEventsService + include Gitlab::Utils::StrongMemoize + include ExclusiveLeaseGuard + + BATCH_SIZE = 1000 + + def initialize(sync_event_class, sync_class) + @sync_event_class = sync_event_class + @sync_class = sync_class + end + + def execute + return unless ::Feature.enabled?(:ci_namespace_project_mirrors, default_enabled: :yaml) + + # preventing parallel processing over the same event table + try_obtain_lease { process_events } + + enqueue_worker_if_there_still_event + end + + private + + def process_events + events = @sync_event_class.preload_synced_relation.first(BATCH_SIZE) + + return if events.empty? + + first = events.first + last_processed = nil + + begin + events.each do |event| + @sync_class.sync!(event) + + last_processed = event + end + ensure + # remove events till the one that was last succesfully processed + @sync_event_class.id_in(first.id..last_processed.id).delete_all if last_processed + end + end + + def enqueue_worker_if_there_still_event + @sync_event_class.enqueue_worker if @sync_event_class.exists? + end + + def lease_key + "#{super}::#{@sync_event_class}" + end + + def lease_timeout + 1.minute + end + end +end diff --git a/app/services/ci/queue/build_queue_service.rb b/app/services/ci/queue/build_queue_service.rb index 3c886cb023f..9f476c8a785 100644 --- a/app/services/ci/queue/build_queue_service.rb +++ b/app/services/ci/queue/build_queue_service.rb @@ -24,7 +24,7 @@ module Ci # rubocop:disable CodeReuse/ActiveRecord def builds_for_group_runner - if strategy.use_denormalized_namespace_traversal_ids? + 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` @@ -89,11 +89,9 @@ module Ci end def runner_projects_relation - if ::Feature.enabled?(:ci_pending_builds_project_runners_decoupling, runner, default_enabled: :yaml) - runner.runner_projects.select('"ci_runner_projects"."project_id"::bigint') - else - runner.projects.without_deleted.with_builds_enabled - end + runner + .runner_projects + .select('"ci_runner_projects"."project_id"::bigint') end end end diff --git a/app/services/ci/queue/builds_table_strategy.rb b/app/services/ci/queue/builds_table_strategy.rb index ac449a5289e..237dd510d50 100644 --- a/app/services/ci/queue/builds_table_strategy.rb +++ b/app/services/ci/queue/builds_table_strategy.rb @@ -57,15 +57,7 @@ module Ci relation.pluck(:id) end - def use_denormalized_shared_runners_data? - false - end - - def use_denormalized_minutes_data? - false - end - - def use_denormalized_namespace_traversal_ids? + def use_denormalized_data_strategy? false end diff --git a/app/services/ci/queue/pending_builds_strategy.rb b/app/services/ci/queue/pending_builds_strategy.rb index 7a913e47df4..47158b8ea1d 100644 --- a/app/services/ci/queue/pending_builds_strategy.rb +++ b/app/services/ci/queue/pending_builds_strategy.rb @@ -23,7 +23,7 @@ module Ci end def builds_matching_tag_ids(relation, ids) - if ::Feature.enabled?(:ci_queueing_denormalize_tags_information, runner, default_enabled: :yaml) + 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')) @@ -31,7 +31,7 @@ module Ci end def builds_with_any_tags(relation) - if ::Feature.enabled?(:ci_queueing_denormalize_tags_information, runner, default_enabled: :yaml) + 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')) @@ -50,22 +50,14 @@ module Ci relation.pluck(:build_id) end - def use_denormalized_shared_runners_data? - ::Feature.enabled?(:ci_queueing_denormalize_shared_runners_information, runner, type: :development, default_enabled: :yaml) - end - - def use_denormalized_minutes_data? - ::Feature.enabled?(:ci_queueing_denormalize_ci_minutes_information, runner, type: :development, default_enabled: :yaml) - end - - def use_denormalized_namespace_traversal_ids? - ::Feature.enabled?(:ci_queueing_denormalize_namespace_traversal_ids, runner, type: :development, default_enabled: :yaml) + def use_denormalized_data_strategy? + ::Feature.enabled?(:ci_queuing_use_denormalized_data_strategy, default_enabled: :yaml) end private def builds_available_for_shared_runners - if use_denormalized_shared_runners_data? + if use_denormalized_data_strategy? new_builds.with_instance_runners else new_builds diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 67ef4f10709..e0f0f8f58b8 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -269,14 +269,7 @@ module Ci { missing_dependency_failure: -> (build, _) { !build.has_valid_build_dependencies? }, runner_unsupported: -> (build, params) { !build.supported_runner?(params.dig(:info, :features)) }, - archived_failure: -> (build, _) { build.archived? } - }.merge(builds_enabled_checks) - end - - def builds_enabled_checks - return {} unless ::Feature.enabled?(:ci_queueing_builds_enabled_checks, runner, default_enabled: :yaml) - - { + archived_failure: -> (build, _) { build.archived? }, project_deleted: -> (build, _) { build.project.pending_delete? }, builds_disabled: -> (build, _) { !build.project.builds_enabled? } } diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb index ebb07de9d29..89fe4ff9f60 100644 --- a/app/services/ci/retry_build_service.rb +++ b/app/services/ci/retry_build_service.rb @@ -2,12 +2,14 @@ module Ci class RetryBuildService < ::BaseService + include Gitlab::Utils::StrongMemoize + def self.clone_accessors %i[pipeline project ref tag options name allow_failure stage stage_id stage_idx trigger_request yaml_variables when environment coverage_regex description tag_list protected needs_attributes - resource_group scheduling_type].freeze + job_variables_attributes resource_group scheduling_type].freeze end def self.extra_accessors @@ -45,6 +47,11 @@ module Ci job.save! end end + + if create_deployment_in_separate_transaction? + clone_deployment!(new_build, build) + end + build.reset # refresh the data to get new values of `retried` and `processed`. new_build @@ -63,7 +70,9 @@ module Ci def clone_build(build) project.builds.new(build_attributes(build)).tap do |new_build| - new_build.assign_attributes(deployment_attributes_for(new_build, build)) + unless create_deployment_in_separate_transaction? + new_build.assign_attributes(deployment_attributes_for(new_build, build)) + end end end @@ -72,6 +81,11 @@ module Ci [attribute, build.public_send(attribute)] # rubocop:disable GitlabSecurity/PublicSend end + if create_deployment_in_separate_transaction? && build.persisted_environment.present? + attributes[:metadata_attributes] ||= {} + attributes[:metadata_attributes][:expanded_environment_name] = build.expanded_environment_name + end + attributes[:user] = current_user attributes end @@ -80,6 +94,26 @@ module Ci ::Gitlab::Ci::Pipeline::Seed::Build .deployment_attributes_for(new_build, old_build.persisted_environment) end + + def clone_deployment!(new_build, old_build) + return unless old_build.deployment.present? + + # We should clone the previous deployment attributes instead of initializing + # new object with `Seed::Deployment`. + # See https://gitlab.com/gitlab-org/gitlab/-/issues/347206 + deployment = ::Gitlab::Ci::Pipeline::Seed::Deployment + .new(new_build, old_build.persisted_environment).to_resource + + return unless deployment + + new_build.create_deployment!(deployment.attributes) + end + + def create_deployment_in_separate_transaction? + strong_memoize(:create_deployment_in_separate_transaction) do + ::Feature.enabled?(:create_deployment_in_separate_transaction, project, default_enabled: :yaml) + end + end end end diff --git a/app/services/ci/stuck_builds/drop_pending_service.rb b/app/services/ci/stuck_builds/drop_pending_service.rb index 4653e701973..dddd1cfb781 100644 --- a/app/services/ci/stuck_builds/drop_pending_service.rb +++ b/app/services/ci/stuck_builds/drop_pending_service.rb @@ -7,7 +7,6 @@ module Ci BUILD_PENDING_OUTDATED_TIMEOUT = 1.day BUILD_PENDING_STUCK_TIMEOUT = 1.hour - BUILD_LOOKBACK = 5.days def execute Gitlab::AppLogger.info "#{self.class}: Cleaning pending timed-out builds" @@ -30,11 +29,11 @@ module Ci # because we want to force the query planner to use the # `ci_builds_gitlab_monitor_metrics` index all the time. def pending_builds(timeout) - if Feature.enabled?(:ci_new_query_for_pending_stuck_jobs) - Ci::Build.pending.created_at_before(timeout).updated_at_before(timeout).order(created_at: :asc, project_id: :asc) - else - Ci::Build.pending.updated_before(lookback: BUILD_LOOKBACK.ago, timeout: timeout) - end + Ci::Build + .pending + .created_at_before(timeout) + .updated_at_before(timeout) + .order(created_at: :asc, project_id: :asc) end # rubocop: enable CodeReuse/ActiveRecord end diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb index c1cbf031ca1..146239bb7e5 100644 --- a/app/services/ci/update_build_queue_service.rb +++ b/app/services/ci/update_build_queue_service.rb @@ -14,7 +14,7 @@ module Ci # Add a build to the pending builds queue # def push(build, transition) - return unless maintain_pending_builds_queue?(build) + return unless maintain_pending_builds_queue? raise InvalidQueueTransition unless transition.to == 'pending' @@ -33,7 +33,7 @@ module Ci # Remove a build from the pending builds queue # def pop(build, transition) - return unless maintain_pending_builds_queue?(build) + return unless maintain_pending_builds_queue? raise InvalidQueueTransition unless transition.from == 'pending' @@ -52,7 +52,7 @@ module Ci # Add shared runner build tracking entry (used for queuing). # def track(build, transition) - return unless Feature.enabled?(:ci_track_shared_runner_builds, build.project, default_enabled: :yaml) + return unless maintain_pending_builds_queue? return unless build.shared_runner_build? raise InvalidQueueTransition unless transition.to == 'running' @@ -73,7 +73,7 @@ module Ci # queuing). # def untrack(build, transition) - return unless Feature.enabled?(:ci_untrack_shared_runner_builds, build.project, default_enabled: :yaml) + return unless maintain_pending_builds_queue? return unless build.shared_runner_build? raise InvalidQueueTransition unless transition.from == 'running' @@ -113,8 +113,8 @@ module Ci end end - def maintain_pending_builds_queue?(build) - Feature.enabled?(:ci_pending_builds_queue_maintain, build.project, default_enabled: :yaml) + def maintain_pending_builds_queue? + ::Ci::PendingBuild.maintain_denormalized_data? end end end diff --git a/app/services/ci/update_build_state_service.rb b/app/services/ci/update_build_state_service.rb index 826d9a2eda3..9df36b86404 100644 --- a/app/services/ci/update_build_state_service.rb +++ b/app/services/ci/update_build_state_service.rb @@ -216,11 +216,12 @@ module Ci end def chunks_migration_enabled? - ::Gitlab::Ci::Features.accept_trace?(build.project) + ::Feature.enabled?(:ci_enable_live_trace, build.project) && + ::Feature.enabled?(:ci_accept_trace, build.project, type: :ops, default_enabled: true) end def log_invalid_chunks? - ::Gitlab::Ci::Features.log_invalid_trace_chunks?(build.project) + ::Feature.enabled?(:ci_trace_log_invalid_chunks, build.project, type: :ops, default_enabled: false) end end end diff --git a/app/services/ci/update_pending_build_service.rb b/app/services/ci/update_pending_build_service.rb index d546dbcfe3d..733b684bcc6 100644 --- a/app/services/ci/update_pending_build_service.rb +++ b/app/services/ci/update_pending_build_service.rb @@ -9,13 +9,13 @@ module Ci def initialize(model, update_params) @model = model - @update_params = update_params + @update_params = update_params.symbolize_keys validations! end def execute - return unless ::Feature.enabled?(:ci_pending_builds_maintain_shared_runners_data, @model, default_enabled: :yaml) + return unless ::Ci::PendingBuild.maintain_denormalized_data? @model.pending_builds.each_batch do |relation| relation.update_all(@update_params) |