aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-05-10 16:44:28 +0100
committerChristopher Baines <mail@cbaines.net>2020-05-10 16:44:28 +0100
commit0c7643fc649ee46cbb75af325fc3f20034b75529 (patch)
tree0b51730c9efd1c7ff59b81f39663b30544906960
parentb7b722d23a05a5c36fb9351b84076b009b7d0188 (diff)
downloadbuild-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.scm1
-rw-r--r--guix-build-coordinator/datastore/sqlite.scm50
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