[arvados] created: 2.5.0-263-g1ba4c76f7

git repository hosting git at public.arvados.org
Thu Mar 9 21:37:17 UTC 2023


        at  1ba4c76f70f0f3d68e01fc548b0b7de0d43723ca (commit)


commit 1ba4c76f70f0f3d68e01fc548b0b7de0d43723ca
Author: Peter Amstutz <peter.amstutz at curii.com>
Date:   Thu Mar 9 16:36:09 2023 -0500

    20223: Try to make priority update much lighter weight
    
    Uses select and pluck in several places to avoid loading full records.
    
    Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz at curii.com>

diff --git a/services/api/app/models/container.rb b/services/api/app/models/container.rb
index 7837e0812..b59604cb2 100644
--- a/services/api/app/models/container.rb
+++ b/services/api/app/models/container.rb
@@ -131,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
@@ -151,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
 
@@ -830,19 +829,21 @@ 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|
-            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
-                # 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
-                # running, leave it alone so it can get cancelled the
-                # usual way, get a copy of the log collection, etc.)
-                cr.update_attributes!(state: ContainerRequest::Final)
+                  state: ContainerRequest::Committed).
+            find_in_batches(batch_size: 10) do |batch|
+            batch.each do |cr|
+              leave_modified_by_user_alone do
+                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
+                  # running, leave it alone so it can get cancelled the
+                  # usual way, get a copy of the log collection, etc.)
+                  cr.update_attributes!(state: ContainerRequest::Final)
+                end
               end
             end
           end
diff --git a/services/api/app/models/container_request.rb b/services/api/app/models/container_request.rb
index 0701adb32..ae50f5574 100644
--- a/services/api/app/models/container_request.rb
+++ b/services/api/app/models/container_request.rb
@@ -300,6 +300,10 @@ class ContainerRequest < ArvadosModel
     super - ["mounts", "secret_mounts", "secret_mounts_md5", "runtime_token", "output_storage_classes"]
   end
 
+  def set_priority_zero
+    self.update_attributes!(priority: 0) if self.priority > 0 && self.state != Final
+  end
+
   protected
 
   def fill_field_defaults
@@ -564,10 +568,6 @@ class ContainerRequest < ArvadosModel
     end
   end
 
-  def set_priority_zero
-    self.update_attributes!(priority: 0) if self.state != Final
-  end
-
   def set_requesting_container_uuid
     if (self.requesting_container_uuid = get_requesting_container_uuid())
       # Determine the priority of container request for the requesting

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list