Merge branch '20240-container-update-deadlock'
[arvados.git] / services / api / app / controllers / arvados / v1 / containers_controller.rb
index 20e7d6272e1e1c1d0deafa94272fddb39b755e6f..b06d65a36c13bfda924fb40f6408bcfe8363d748 100644 (file)
@@ -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 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 EXCLUSIVE MODE"
+      @object.reload(lock: true)
+      @object.update_priority!
+      show
+    end
   end
 
   def current