Merge branch '19972-go-client-retry'
[arvados.git] / services / api / app / models / container.rb
index e6643d4c70d7937f9509e57db420d1e98e9627e0..0eaf640b6c37fda7ccf0379f02fb683f4f5eabe2 100644 (file)
@@ -5,7 +5,6 @@
 require 'log_reuse_info'
 require 'whitelist_update'
 require 'safe_json'
-require 'update_priority'
 
 class Container < ArvadosModel
   include ArvadosModelUpdates
@@ -51,7 +50,6 @@ class Container < ArvadosModel
   after_save :update_cr_logs
   after_save :handle_completed
   after_save :propagate_priority
-  after_commit { UpdatePriority.run_update_thread }
 
   has_many :container_requests, :foreign_key => :container_uuid, :class_name => 'ContainerRequest', :primary_key => :uuid
   belongs_to :auth, :class_name => 'ApiClientAuthorization', :foreign_key => :auth_uuid, :primary_key => :uuid
@@ -133,12 +131,12 @@ class Container < ArvadosModel
   def update_priority!
     return if ![Queued, Locked, Running].include?(state)
     p = ContainerRequest.
-        where('container_uuid=? and priority>0', uuid).
-        includes(:requesting_container).
-        lock(true).
-        map do |cr|
-      if cr.requesting_container
-        cr.requesting_container.priority
+          where('container_uuid=? and priority>0', uuid).
+          select("priority, requesting_container_uuid, created_at").
+          lock(true).
+          map do |cr|
+      if cr.requesting_container_uuid
+        Container.where(uuid: cr.requesting_container_uuid).pluck(:priority).first
       else
         (cr.priority << 50) - (cr.created_at.to_time.to_f * 1000).to_i
       end
@@ -153,12 +151,11 @@ class Container < ArvadosModel
       # priority of the parent container (ignoring requests with no
       # container assigned, because their priority doesn't matter).
       ContainerRequest.
-        where(requesting_container_uuid: self.uuid,
-              state: ContainerRequest::Committed).
-        where('container_uuid is not null').
-        includes(:container).
-        map(&:container).
-        map(&:update_priority!)
+        where('requesting_container_uuid = ? and state = ? and container_uuid is not null',
+              self.uuid, ContainerRequest::Committed).
+        pluck(:container_uuid).each do |container_uuid|
+        Container.find_by_uuid(container_uuid).update_priority!
+      end
     end
   end
 
@@ -832,13 +829,13 @@ class Container < ArvadosModel
 
           # Cancel outstanding container requests made by this container.
           ContainerRequest.
-            includes(:container).
             where(requesting_container_uuid: uuid,
-                  state: ContainerRequest::Committed).each do |cr|
+                  state: ContainerRequest::Committed).
+            in_batches(of: 15).each_record do |cr|
             leave_modified_by_user_alone do
-              cr.update_attributes!(priority: 0)
-              cr.container.reload
-              if cr.container.state == Container::Queued || cr.container.state == Container::Locked
+              cr.set_priority_zero
+              container_state = Container.where(uuid: cr.container_uuid).pluck(:state).first
+              if container_state == Container::Queued || container_state == Container::Locked
                 # If the child container hasn't started yet, finalize the
                 # child CR now instead of leaving it "on hold", i.e.,
                 # Queued with priority 0.  (OTOH, if the child is already