X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/764334dee966e04161d411a9feb0074b99faa147..3b3794c7e0e026a6338165b9e171925e384e6502:/services/api/app/models/container.rb diff --git a/services/api/app/models/container.rb b/services/api/app/models/container.rb index e9d4f83658..1dbdb57105 100644 --- a/services/api/app/models/container.rb +++ b/services/api/app/models/container.rb @@ -316,11 +316,11 @@ class Container < ArvadosModel # (because state might have changed while acquiring the lock). check_lock_fail transaction do - begin - reload(lock: 'FOR UPDATE NOWAIT') - rescue - raise LockFailedError.new("cannot lock: other transaction in progress") - end + # Locking involves assigning auth_uuid, which involves looking + # up container requests, so we must lock both tables in the + # proper order to avoid deadlock. + ActiveRecord::Base.connection.execute('LOCK container_requests, containers IN EXCLUSIVE MODE') + reload check_lock_fail update_attributes!(state: Locked) end