Make retry_lock to not be infinite
This commit is contained in:
parent
39c17ccb87
commit
2822526e7b
3 changed files with 20 additions and 5 deletions
|
@ -31,8 +31,8 @@ module Ci
|
|||
|
||||
if HasStatus::COMPLETED_STATUSES.include?(current_status)
|
||||
created_builds_in_stage(index).select do |build|
|
||||
Gitlab::OptimisticLocking.retry_lock(build) do |build|
|
||||
process_build(build, current_status)
|
||||
Gitlab::OptimisticLocking.retry_lock(build) do |subject|
|
||||
process_build(subject, current_status)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,12 +1,16 @@
|
|||
module Gitlab
|
||||
class OptimisticLocking
|
||||
def self.retry_lock(subject, &block)
|
||||
module OptimisticLocking
|
||||
extend self
|
||||
|
||||
def retry_lock(subject, retries = 100, &block)
|
||||
loop do
|
||||
begin
|
||||
subject.transaction do
|
||||
ActiveRecord::Base.transaction do
|
||||
return block.call(subject)
|
||||
end
|
||||
rescue ActiveRecord::StaleObjectError
|
||||
retries -= 1
|
||||
raise unless retries >= 0
|
||||
subject.reload
|
||||
end
|
||||
end
|
||||
|
|
|
@ -24,5 +24,16 @@ describe Gitlab::OptimisticLocking, lib: true do
|
|||
subject.drop
|
||||
end
|
||||
end
|
||||
|
||||
it 'raises exception when too many retries' do
|
||||
expect(pipeline).to receive(:drop).twice.and_call_original
|
||||
|
||||
expect do
|
||||
described_class.retry_lock(pipeline, 1) do |subject|
|
||||
subject.lock_version = 100
|
||||
subject.drop
|
||||
end
|
||||
end.to raise_error(ActiveRecord::StaleObjectError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue