Avoid a recursive CTE for finding blocked builds where possible

Use the new approach of looking up the distribution of the derivations, and
building a non recursive query specifically for this revision. This should
avoid PostgreSQL picking a poor plan for performing the query.
This commit is contained in:
Christopher Baines 2023-03-09 08:36:51 +00:00
parent e39c9da028
commit 659dcc6a0d

View file

@ -26,6 +26,7 @@
#:use-module (guix-data-service model utils) #:use-module (guix-data-service model utils)
#:use-module (guix-data-service model system) #:use-module (guix-data-service model system)
#:use-module (guix-data-service model guix-revision) #:use-module (guix-data-service model guix-revision)
#:use-module (guix-data-service model guix-revision-package-derivation)
#:use-module (guix-data-service model build) #:use-module (guix-data-service model build)
#:export (handle-blocked-builds-entries-for-scheduled-builds #:export (handle-blocked-builds-entries-for-scheduled-builds
handle-populating-blocked-builds-for-build-failures handle-populating-blocked-builds-for-build-failures
@ -352,6 +353,13 @@ WHERE status IN ('failed', 'failed-dependency', 'failed-other', 'canceled')
system target system target
limit) limit)
(define query (define query
(string-append
(or
(get-sql-to-select-package-and-related-derivations-for-revision
conn
(commit->revision-id conn revision-commit)
#:system-id (system->system-id conn system)
#:target target)
(string-append (string-append
" "
WITH RECURSIVE all_derivations AS ( WITH RECURSIVE all_derivations AS (
@ -361,7 +369,7 @@ WITH RECURSIVE all_derivations AS (
INNER JOIN guix_revision_package_derivations INNER JOIN guix_revision_package_derivations
ON package_derivations.id ON package_derivations.id
= guix_revision_package_derivations.package_derivation_id = guix_revision_package_derivations.package_derivation_id
WHERE revision_id = $1" WHERE revision_id = " (commit->revision-id conn revision-commit)
(if system (if system
(simple-format (simple-format
#f " #f "
@ -383,7 +391,8 @@ WITH RECURSIVE all_derivations AS (
ON all_derivations.derivation_id = derivation_inputs.derivation_id ON all_derivations.derivation_id = derivation_inputs.derivation_id
INNER JOIN derivation_outputs INNER JOIN derivation_outputs
ON derivation_inputs.derivation_output_id = derivation_outputs.id ON derivation_inputs.derivation_output_id = derivation_outputs.id
), all_derivation_output_details_set_ids AS ( )"))
", all_derivation_output_details_set_ids AS (
SELECT derivations_by_output_details_set.* SELECT derivations_by_output_details_set.*
FROM derivations_by_output_details_set FROM derivations_by_output_details_set
WHERE derivation_id IN ( WHERE derivation_id IN (
@ -452,4 +461,4 @@ LIMIT " (number->string limit))
(eq? #f builds)) (eq? #f builds))
#() #()
(json-string->scm builds)))))) (json-string->scm builds))))))
(exec-query conn query (list (commit->revision-id conn revision-commit))))) (exec-query conn query)))