diff options
author | Christopher Baines <mail@cbaines.net> | 2020-05-10 16:44:28 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2020-05-10 16:44:28 +0100 |
commit | 0c7643fc649ee46cbb75af325fc3f20034b75529 (patch) | |
tree | 0b51730c9efd1c7ff59b81f39663b30544906960 | |
parent | b7b722d23a05a5c36fb9351b84076b009b7d0188 (diff) | |
download | build-coordinator-0c7643fc649ee46cbb75af325fc3f20034b75529.tar build-coordinator-0c7643fc649ee46cbb75af325fc3f20034b75529.tar.gz |
Add datastore-fetch-input-builds-for-unprocessed-builds
This will be used by the derivation ordered allocator to find builds which can
be performed.
-rw-r--r-- | guix-build-coordinator/datastore.scm | 1 | ||||
-rw-r--r-- | guix-build-coordinator/datastore/sqlite.scm | 50 |
2 files changed, 51 insertions, 0 deletions
diff --git a/guix-build-coordinator/datastore.scm b/guix-build-coordinator/datastore.scm index 465cd2b..d1c08bf 100644 --- a/guix-build-coordinator/datastore.scm +++ b/guix-build-coordinator/datastore.scm @@ -33,6 +33,7 @@ (re-export datastore-list-builds-for-derivation) (re-export datastore-list-processed-builds) (re-export datastore-list-unprocessed-builds) +(re-export datastore-fetch-input-builds-for-unprocessed-builds) (re-export datastore-list-unprocessed-hook-events) (re-export datastore-delete-unprocessed-hook-event) (re-export datastore-list-agent-builds) diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm index fe8424d..138decc 100644 --- a/guix-build-coordinator/datastore/sqlite.scm +++ b/guix-build-coordinator/datastore/sqlite.scm @@ -39,6 +39,7 @@ datastore-agent-password-exists? datastore-list-processed-builds datastore-list-unprocessed-builds + datastore-fetch-input-builds-for-unprocessed-builds datastore-list-unprocessed-hook-events datastore-delete-unprocessed-hook-event datastore-list-agent-builds @@ -892,6 +893,55 @@ ORDER BY priority DESC"))) builds))))) +(define-method (datastore-fetch-input-builds-for-unprocessed-builds + (datastore <sqlite-datastore>)) + (call-with-worker-thread + (slot-ref datastore 'worker-reader-thread-channel) + (lambda (db) + (let ((statement + (sqlite-prepare + db + " +SELECT builds.uuid, derivation_outputs.output, + input_builds.uuid, input_build_results.result +FROM builds +INNER JOIN derivation_inputs + ON builds.derivation_name = derivation_inputs.derivation_name +INNER JOIN derivation_outputs + ON derivation_inputs.derivation_output_id = derivation_outputs.id +INNER JOIN derivation_outputs AS input_build_derivation_outputs + ON derivation_outputs.output = input_build_derivation_outputs.output +INNER JOIN builds AS input_builds + ON input_builds.derivation_name = input_build_derivation_outputs.derivation_name +INNER JOIN build_results AS input_build_results + ON input_builds.uuid = input_build_results.build_id +WHERE builds.processed = 0"))) + + (let ((result (sqlite-fold + (lambda (row result) + (match row + (#(build-uuid output input-build-uuid input-build-result) + (let ((input-builds-alist + (or (hash-ref result build-uuid) + '()))) + (hash-set! + result + build-uuid + (let ((other-builds-for-output + (or (assoc-ref input-builds-alist + output) + '()))) + `((,output . (((build_id . ,input-build-uuid) + (result . ,input-build-result)) + ,@other-builds-for-output)) + ,@(alist-delete output input-builds-alist))))))) + result) + (make-hash-table) + statement))) + (sqlite-reset statement) + + result))))) + (define (insert-unprocessed-hook-event db event |