end
def lock
- self.with_lock do
+ self.reload.with_lock do
if self.state != Queued
raise LockFailedError.new("cannot lock when #{self.state}")
end
end
def unlock
- self.with_lock do
+ self.reload.with_lock do
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?
- # 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
# 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.with_lock do
+ 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)
}
c = Container.create! c_attrs
retryable_requests.each do |cr|
- cr.with_lock do
+ cr.reload.with_lock do
leave_modified_by_user_alone do
# Use row locking because this increments container_count
cr.container_uuid = c.uuid
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