From 28da710485559dac72a8b2380dce1973a5e2893a Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Fri, 31 Mar 2023 11:14:19 -0400 Subject: [PATCH] 20240: Lock containers table before cascading priority updates. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- .../arvados/v1/container_requests_controller.rb | 16 ++++++++++++++++ .../arvados/v1/containers_controller.rb | 14 ++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/services/api/app/controllers/arvados/v1/container_requests_controller.rb b/services/api/app/controllers/arvados/v1/container_requests_controller.rb index 07b8098f5b..86b4b64860 100644 --- a/services/api/app/controllers/arvados/v1/container_requests_controller.rb +++ b/services/api/app/controllers/arvados/v1/container_requests_controller.rb @@ -28,4 +28,20 @@ class Arvados::V1::ContainerRequestsController < ApplicationController }, }) end + + def create + # Lock containers table to avoid deadlock in cascading priority update (see #20240) + Container.transaction do + ActiveRecord::Base.connection.execute "LOCK TABLE containers IN SHARE ROW EXCLUSIVE MODE" + super + end + end + + def update + # Lock containers table to avoid deadlock in cascading priority update (see #20240) + Container.transaction do + ActiveRecord::Base.connection.execute "LOCK TABLE containers IN SHARE ROW EXCLUSIVE MODE" + super + end + end end diff --git a/services/api/app/controllers/arvados/v1/containers_controller.rb b/services/api/app/controllers/arvados/v1/containers_controller.rb index 20e7d6272e..73701b92ce 100644 --- a/services/api/app/controllers/arvados/v1/containers_controller.rb +++ b/services/api/app/controllers/arvados/v1/containers_controller.rb @@ -29,7 +29,9 @@ class Arvados::V1::ContainersController < ApplicationController end def update - @object.with_lock do + # Lock containers table to avoid deadlock in cascading priority update (see #20240) + Container.transaction do + ActiveRecord::Base.connection.execute "LOCK TABLE containers IN SHARE ROW EXCLUSIVE MODE" super end end @@ -59,9 +61,13 @@ class Arvados::V1::ContainersController < ApplicationController end def update_priority - @object.reload(lock: true) - @object.update_priority! - show + # Lock containers table to avoid deadlock in cascading priority update (see #20240) + Container.transaction do + ActiveRecord::Base.connection.execute "LOCK TABLE containers IN SHARE ROW EXCLUSIVE MODE" + @object.reload(lock: true) + @object.update_priority! + show + end end def current -- 2.30.2