Previous versions of rails did an implicit reload when calling with_lock,
but from 5.2 calling with_lock with unpersisted changes will raise an
exception.
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas@di-pentima.com.ar>
+ @object.reload.with_lock do
+ self.reload.with_lock do
if self.state != Queued
raise LockFailedError.new("cannot lock when #{self.state}")
end
if self.state != Queued
raise LockFailedError.new("cannot lock when #{self.state}")
end
+ self.reload.with_lock do
if self.state != Locked
raise InvalidStateTransitionError.new("cannot unlock when #{self.state}")
end
if self.state != Locked
raise InvalidStateTransitionError.new("cannot unlock when #{self.state}")
end
# This container is finished so finalize any associated container requests
# that are associated with this container.
if saved_change_to_state? and self.final?
# This container is finished so finalize any associated container requests
# that are associated with this container.
if saved_change_to_state? and self.final?
- # These get wiped out by with_lock (which reloads the record),
+ # These get wiped out (with_lock requires to explicitly reload the record),
# so record them now in case we need to schedule a retry.
prev_secret_mounts = secret_mounts_before_last_save
prev_runtime_token = runtime_token_before_last_save
# so record them now in case we need to schedule a retry.
prev_secret_mounts = secret_mounts_before_last_save
prev_runtime_token = runtime_token_before_last_save
# transaction finishes. This ensure that concurrent container
# requests that try to reuse this container are finalized (on
# Complete) or don't reuse it (on Cancelled).
# transaction finishes. This ensure that concurrent container
# requests that try to reuse this container are finalized (on
# Complete) or don't reuse it (on Cancelled).
+ self.reload.with_lock do
act_as_system_user do
if self.state == Cancelled
retryable_requests = ContainerRequest.where("container_uuid = ? and priority > 0 and state = 'Committed' and container_count < container_count_max", uuid)
act_as_system_user do
if self.state == Cancelled
retryable_requests = ContainerRequest.where("container_uuid = ? and priority > 0 and state = 'Committed' and container_count < container_count_max", uuid)
}
c = Container.create! c_attrs
retryable_requests.each do |cr|
}
c = Container.create! c_attrs
retryable_requests.each do |cr|
leave_modified_by_user_alone do
# Use row locking because this increments container_count
cr.container_uuid = c.uuid
leave_modified_by_user_alone do
# Use row locking because this increments container_count
cr.container_uuid = c.uuid
end
def lock locked_by_uuid
end
def lock locked_by_uuid
unless self.state == Queued and self.is_locked_by_uuid.nil?
raise AlreadyLockedError
end
unless self.state == Queued and self.is_locked_by_uuid.nil?
raise AlreadyLockedError
end
c2.description = 'foo collection'
c1.save!
assert_equal 1, c2.version
c2.description = 'foo collection'
c1.save!
assert_equal 1, c2.version
- # with_lock forces a reload, so this shouldn't produce an unique violation error
+ # with_lock requires a reload, so this shouldn't produce an unique violation error
c2.save!
assert_equal 3, c2.version
assert_equal 'foo collection', c2.description
c2.save!
assert_equal 3, c2.version
assert_equal 'foo collection', c2.description