diff options
author | Christopher Baines <mail@cbaines.net> | 2020-10-24 19:14:30 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2020-10-24 19:14:30 +0100 |
commit | 6160f09410a330a03fe6a95b3252b6f5c4322931 (patch) | |
tree | 5487953e6fbe27e7986f5c52537f8416c8fb152e /guix-build-coordinator | |
parent | 0df7fce1f2746fadfe3f9aa82826b48c84b3eab2 (diff) | |
download | build-coordinator-6160f09410a330a03fe6a95b3252b6f5c4322931.tar build-coordinator-6160f09410a330a03fe6a95b3252b6f5c4322931.tar.gz |
Don't assume the missing input to a build is a direct input
Substitutes could be available for all direct inputs, but be missing for
things they reference. This could happen if those builds happened on a machine
with the store items available for example.
Therefore, search the entire graph for the relevant derivation when looking
for the derivation to build to provide the missing input.
This change matches up with the similar improvement around handling fetching
substitutes.
Diffstat (limited to 'guix-build-coordinator')
-rw-r--r-- | guix-build-coordinator/datastore.scm | 1 | ||||
-rw-r--r-- | guix-build-coordinator/datastore/sqlite.scm | 42 | ||||
-rw-r--r-- | guix-build-coordinator/hooks.scm | 61 |
3 files changed, 71 insertions, 33 deletions
diff --git a/guix-build-coordinator/datastore.scm b/guix-build-coordinator/datastore.scm index 607a412..af55583 100644 --- a/guix-build-coordinator/datastore.scm +++ b/guix-build-coordinator/datastore.scm @@ -49,6 +49,7 @@ (re-export datastore-find-derivation-outputs) (re-export datastore-find-derivation-system) (re-export datastore-find-derivation-inputs) +(re-export datastore-find-derivation-for-output) (re-export datastore-list-builds-for-output) (re-export datastore-list-builds-for-output-and-system) (re-export datastore-agent-for-build) diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm index 7783f76..dd7b592 100644 --- a/guix-build-coordinator/datastore/sqlite.scm +++ b/guix-build-coordinator/datastore/sqlite.scm @@ -41,6 +41,7 @@ datastore-find-derivation datastore-find-derivation-system datastore-find-derivation-inputs + datastore-find-derivation-for-output datastore-find-derivation-outputs datastore-list-builds-for-output datastore-list-builds-for-output-and-system @@ -1963,6 +1964,47 @@ WHERE derivation_inputs.derivation_name = :derivation_name" result))))) +(define-method (datastore-find-derivation-for-output + (datastore <sqlite-datastore>) + start-derivation-name + output) + (call-with-worker-thread + (slot-ref datastore 'worker-reader-thread-channel) + (lambda (db) + (let ((statement + (sqlite-prepare + db + " +WITH RECURSIVE related_derivations(name) AS ( + VALUES(:derivation) +UNION + SELECT derivation_outputs.derivation_name + FROM derivation_outputs + INNER JOIN derivation_inputs + ON derivation_outputs.id = derivation_inputs.derivation_output_id + INNER JOIN related_derivations + ON related_derivations.name = derivation_inputs.derivation_name +) +SELECT related_derivations.name +FROM related_derivations +INNER JOIN derivation_outputs + ON related_derivations.name = derivation_outputs.derivation_name +WHERE output = :output +"))) + + (sqlite-bind-arguments + statement + #:derivation start-derivation-name + #:output output) + + (let ((result + (match (sqlite-step statement) + (#f #f) + (#(derivation) derivation)))) + (sqlite-reset statement) + + result))))) + (define (insert-derivation-and-return-outputs db derivation) (define derivation-name (derivation-file-name derivation)) diff --git a/guix-build-coordinator/hooks.scm b/guix-build-coordinator/hooks.scm index e4b2bff..0006a95 100644 --- a/guix-build-coordinator/hooks.scm +++ b/guix-build-coordinator/hooks.scm @@ -337,39 +337,34 @@ (build-coordinator-datastore build-coordinator)) (let ((build (datastore-find-build datastore build-id))) - (let ((derivation-inputs - (datastore-find-derivation-inputs datastore - (assq-ref build 'derivation-name)))) - (simple-format #t "missing-inputs: ~A\n~A\n" - build-id - (string-join (map (lambda (input) - (string-append " - " input)) - missing-inputs) - "\n")) - (for-each (lambda (missing-input) - (let ((input-derivation - (any (lambda (derivation-input) - (if (string=? (assq-ref derivation-input 'output) - missing-input) - (assq-ref derivation-input 'derivation) - #f)) - derivation-inputs))) - (unless input-derivation - (error "couldn't find a derivation for " missing-input)) - - (let ((builds-for-output - (datastore-list-builds-for-output datastore - missing-input))) - (if (null? builds-for-output) - (begin - (simple-format #t - "submitting build for ~A\n" - input-derivation) - (submit-build build-coordinator input-derivation)) - (simple-format #t "~A builds exist for ~A, skipping\n" - (length builds-for-output) - missing-input))))) - missing-inputs)))) + (simple-format #t "missing-inputs: ~A\n~A\n" + build-id + (string-join (map (lambda (input) + (string-append " - " input)) + missing-inputs) + "\n")) + (for-each (lambda (missing-input) + (let ((input-derivation + (datastore-find-derivation-for-output + datastore + (assq-ref build 'derivation-name) + missing-input))) + (unless input-derivation + (error "couldn't find a derivation for " missing-input)) + + (let ((builds-for-output + (datastore-list-builds-for-output datastore + missing-input))) + (if (null? builds-for-output) + (begin + (simple-format #t + "submitting build for ~A\n" + input-derivation) + (submit-build build-coordinator input-derivation)) + (simple-format #t "~A builds exist for ~A, skipping\n" + (length builds-for-output) + missing-input))))) + missing-inputs))) (define %default-hooks `((build-submitted . ,default-build-submitted-hook) |