summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2017-12-12 09:40:38 +0000
committerKamil Trzciński <ayufan@ayufan.eu>2017-12-12 09:40:38 +0000
commit6fff0473e0cf13607fdd49f856821680298113d8 (patch)
tree43fe3ddbbe641a399edcc1928d71b82d0aeb2360
parent8a29e0b07367e1d0cc071f0de189aafcae207bf8 (diff)
parent3494cdfecb7748cca558e46c805b636b3383c299 (diff)
downloadgitlab-ce-6fff0473e0cf13607fdd49f856821680298113d8.tar.gz
Merge branch '41023-activerecord-staleobjecterror--attempted-to-update-a-stale-object--ci-build' into 'master'
Job dropping by MissingDependenciesError should consider StaleObjectError Closes #41023 See merge request gitlab-org/gitlab-ce!15873
-rw-r--r--app/services/ci/register_job_service.rb17
-rw-r--r--spec/services/ci/register_job_service_spec.rb13
2 files changed, 22 insertions, 8 deletions
diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb
index c8b6450c9b5..f832b79ef21 100644
--- a/app/services/ci/register_job_service.rb
+++ b/app/services/ci/register_job_service.rb
@@ -38,11 +38,15 @@ module Ci
begin
# In case when 2 runners try to assign the same build, second runner will be declined
# with StateMachines::InvalidTransition or StaleObjectError when doing run! or save method.
- build.runner_id = runner.id
- build.run!
- register_success(build)
-
- return Result.new(build, true)
+ begin
+ build.runner_id = runner.id
+ build.run!
+ register_success(build)
+
+ return Result.new(build, true)
+ rescue Ci::Build::MissingDependenciesError
+ build.drop!(:missing_dependency_failure)
+ end
rescue StateMachines::InvalidTransition, ActiveRecord::StaleObjectError
# We are looping to find another build that is not conflicting
# It also indicates that this build can be picked and passed to runner.
@@ -54,9 +58,6 @@ module Ci
# we still have to return 409 in the end,
# to make sure that this is properly handled by runner.
valid = false
- rescue Ci::Build::MissingDependenciesError
- build.drop!(:missing_dependency_failure)
- valid = false
end
end
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index 3ee59014b5b..22fb7ed7215 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -307,6 +307,19 @@ module Ci
it_behaves_like 'not pick'
end
+
+ context 'when job object is staled' do
+ let!(:pre_stage_job) { create(:ci_build, :running, pipeline: pipeline, name: 'test', stage_idx: 0) }
+
+ before do
+ allow_any_instance_of(Ci::Build).to receive(:drop!)
+ .and_raise(ActiveRecord::StaleObjectError.new(pending_job, :drop!))
+ end
+
+ it 'does not drop nor pick' do
+ expect(subject).to be_nil
+ end
+ end
end
shared_examples 'validation is not active' do