diff options
Diffstat (limited to 'app/services/ci/pipelines/add_job_service.rb')
-rw-r--r-- | app/services/ci/pipelines/add_job_service.rb | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/app/services/ci/pipelines/add_job_service.rb b/app/services/ci/pipelines/add_job_service.rb index 03bdb491200..41f9903e48c 100644 --- a/app/services/ci/pipelines/add_job_service.rb +++ b/app/services/ci/pipelines/add_job_service.rb @@ -3,21 +3,33 @@ module Ci module Pipelines class AddJobService + include ::Gitlab::ExclusiveLeaseHelpers + attr_reader :pipeline def initialize(pipeline) @pipeline = pipeline - raise ArgumentError, "Pipeline must be persisted for this service to be used" unless @pipeline.persisted? + raise ArgumentError, "Pipeline must be persisted for this service to be used" unless pipeline.persisted? end def execute!(job, &block) assign_pipeline_attributes(job) - Ci::Pipeline.transaction do - yield(job) + if Feature.enabled?(:ci_pipeline_add_job_with_lock, pipeline.project, default_enabled: :yaml) + in_lock("ci:pipelines:#{pipeline.id}:add-job", ttl: LOCK_TIMEOUT, sleep_sec: LOCK_SLEEP, retries: LOCK_RETRIES) do + Ci::Pipeline.transaction do + yield(job) + + job.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, pipeline.project, default_enabled: :yaml) + end + end + else + Ci::Pipeline.transaction do + yield(job) - job.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, @pipeline.project, default_enabled: :yaml) + job.update_older_statuses_retried! if Feature.enabled?(:ci_fix_commit_status_retried, pipeline.project, default_enabled: :yaml) + end end ServiceResponse.success(payload: { job: job }) @@ -27,10 +39,14 @@ module Ci private + LOCK_TIMEOUT = 1.minute + LOCK_SLEEP = 0.5.seconds + LOCK_RETRIES = 20 + def assign_pipeline_attributes(job) - job.pipeline = @pipeline - job.project = @pipeline.project - job.ref = @pipeline.ref + job.pipeline = pipeline + job.project = pipeline.project + job.ref = pipeline.ref end end end |