diff options
author | Christopher Baines <mail@cbaines.net> | 2025-03-19 12:58:19 +0000 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2025-03-19 14:36:01 +0000 |
commit | de476a8b408ffc76ea5ec52e4f4ef776025cf48f (patch) | |
tree | acac1169eaaefa6295cce45e686716175ad305d6 /guix-data-service/model | |
parent | f456f73ba464994fc607a9637387957f4b6d07c4 (diff) | |
download | data-service-de476a8b408ffc76ea5ec52e4f4ef776025cf48f.tar data-service-de476a8b408ffc76ea5ec52e4f4ef776025cf48f.tar.gz |
Reapply "Optimise inserting derivation inputs"
Reverting this change entirely was too slow, so change the joins in the query
from inner joins to left joins, as this should mean that NULL values get
inserted if there are missing derivations or derivation outputs, which should
cause an error rather than silently skipping inserting the derivation inputs.
This reverts commit edeb89e0cfca43269c9ae7f50e097c0f58f4e42f.
Diffstat (limited to 'guix-data-service/model')
-rw-r--r-- | guix-data-service/model/derivation.scm | 86 |
1 files changed, 38 insertions, 48 deletions
diff --git a/guix-data-service/model/derivation.scm b/guix-data-service/model/derivation.scm index 53aaa40..a19bfca 100644 --- a/guix-data-service/model/derivation.scm +++ b/guix-data-service/model/derivation.scm @@ -1141,25 +1141,6 @@ ON CONFLICT DO NOTHING" (name missing-derivation-output-error-name) (path missing-derivation-output-error-path)) -(define select-derivation-output-id - (mlambda (conn name path) - (match (exec-query - conn - " -SELECT derivation_outputs.id -FROM derivation_outputs -INNER JOIN derivations - ON derivation_outputs.derivation_id = derivations.id -WHERE derivations.file_name = $1 - AND derivation_outputs.name = $2" - (list path - name)) - (((id)) - id) - (() - (raise-exception - (make-derivation-output-error name path)))))) - (define (select-derivation-outputs-by-derivation-id conn id) (define query (string-append @@ -1432,38 +1413,47 @@ WHERE derivation_source_files.store_path = $1" #f))) (define (insert-derivation-inputs conn derivation-ids derivations) - (define (insert-into-derivation-inputs derivation-id output-ids) - (for-each - (lambda (output-id) + (let ((query-parts + (vector-fold + (lambda (_ result derivation-id derivation) + (fold + (lambda (drv-input result) + (match drv-input + (($ <derivation-input> (? derivation? d) sub-derivations) + (fold (lambda (sub-derivation result) + (cons + (string-append + "(" (number->string derivation-id) + ", '" (derivation-file-name d) + "', '" sub-derivation "')") + result)) + result + sub-derivations)))) + result + (derivation-inputs derivation))) + '() + derivation-ids + derivations))) + + (chunk-for-each! + (lambda (query-parts-chunk) (exec-query conn - " + (string-append + " INSERT INTO derivation_inputs (derivation_id, derivation_output_id) -VALUES ($1, $2);" - (list (number->string derivation-id) output-id))) - output-ids)) - - (vector-for-each - (lambda (i derivation-id derivation) - (let ((inputs (derivation-inputs derivation))) - (unless (null? inputs) - (insert-into-derivation-inputs - derivation-id - (append-map! - (match-lambda - ;; The first field changed to a derivation (from the file name) - ;; in 5cf4b26d52bcea382d98fb4becce89be9ee37b55, so guard against - ;; that in the match - (($ <derivation-input> (? derivation? d) sub-derivations) - (let ((path (derivation-file-name d))) - (map (lambda (sub-derivation) - (select-derivation-output-id conn - sub-derivation - path)) - sub-derivations)))) - inputs))))) - derivation-ids - derivations)) +SELECT vals.derivation_id, derivation_outputs.id +FROM (VALUES " + (string-join query-parts-chunk ", ") + ") AS vals (derivation_id, file_name, output_name) +LEFT JOIN derivations + ON derivations.file_name = vals.file_name +LEFT JOIN derivation_outputs + ON derivation_outputs.derivation_id = derivations.id + AND derivation_outputs.name = vals.output_name +ON CONFLICT DO NOTHING"))) + 1000 + query-parts))) (define (insert-derivation-sources conn derivation-id sources) (define (insert-into-derivation-sources derivation-source-file-ids) |