guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[no subject]


From: Ludovic Courtès
Date: Tue, 28 May 2024 11:05:22 -0400 (EDT)

branch: main
commit 17338588d4862b04e9e405c1244a2ea703b50d98
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Tue May 28 16:12:39 2024 +0200

    database: Rewrite query for ‘db-get-pending-build’.
    
    Previous query would perform several sequential scans, ending up taking
    ~50s on a database with 4M rows in ‘Builds’.
    
    This, in turn, would prevent ‘cuirass remote-worker’ from processing
    incoming messages in a timely fashion: it would reply to
    ‘worker-request-work’ messages after an ever-increasing amount of time;
    having not seen ‘worker-ping’ messages in a timely fashion, it would
    occasionally remove workers.
    
    This new query takes less than a second (thanks, Chris!).
    
    * src/cuirass/database.scm (db-get-pending-build): Rewrite query.
    Lower #:threshold.
    
    Co-authored-by: Christopher Baines <mail@cbaines.net>
---
 src/cuirass/database.scm | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm
index 2f29d45..456b624 100644
--- a/src/cuirass/database.scm
+++ b/src/cuirass/database.scm
@@ -1646,18 +1646,23 @@ highest priority (lowest integer value)."
               ;; Note: Keep ordering in sync with that of the
               ;; 'status+submission-time' filter of 'db-get-builds'.
               (exec-query/bind db "
-WITH pending_dependencies AS
-(SELECT Builds.id, count(dep.id) as deps FROM Builds
-LEFT JOIN BuildDependencies as bd ON bd.source = Builds.id
-LEFT JOIN Builds AS dep ON bd.target = dep.id AND dep.status != 0
-WHERE Builds.status = " (build-status scheduled)
-" AND Builds.system = " system
-" GROUP BY Builds.id
-ORDER BY Builds.priority ASC, Builds.timestamp ASC)
-SELECT id FROM pending_dependencies WHERE deps = 0 LIMIT 1;"))
+  SELECT Builds.id
+  FROM Builds
+  WHERE Builds.status = " (build-status scheduled) "
+    AND Builds.system =  " system "
+    AND NOT EXISTS (
+      SELECT 1
+      FROM BuildDependencies as bd
+      INNER JOIN Builds AS dep
+        ON bd.target = dep.id
+       AND dep.status != 0
+      WHERE bd.source = Builds.id
+    )
+  ORDER BY Builds.priority ASC, Builds.timestamp ASC
+  LIMIT 1;"))
         ((id) (db-get-build (string->number id)))
-        (else #f)))
-    #:threshold 20))
+        (_ #f)))
+    #:threshold 10))
 
 (define-record-type* <checkout> checkout make-checkout
   checkout?



reply via email to

[Prev in Thread] Current Thread [Next in Thread]