aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/datastore/sqlite.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2022-10-11 10:58:52 +0100
committerChristopher Baines <mail@cbaines.net>2022-10-11 10:58:52 +0100
commit2cd06f2cf8a20f719aa3823eeffac8c39b768504 (patch)
tree4d3279047837e6eefefc517a9b9b250595b8a506 /guix-build-coordinator/datastore/sqlite.scm
parent05529c1757d0d5e2a81040b86b4a825c7d88fd9c (diff)
downloadbuild-coordinator-2cd06f2cf8a20f719aa3823eeffac8c39b768504.tar
build-coordinator-2cd06f2cf8a20f719aa3823eeffac8c39b768504.tar.gz
Guard against canceling builds required by others
Diffstat (limited to 'guix-build-coordinator/datastore/sqlite.scm')
-rw-r--r--guix-build-coordinator/datastore/sqlite.scm41
1 files changed, 41 insertions, 0 deletions
diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm
index ba44d75..11947e3 100644
--- a/guix-build-coordinator/datastore/sqlite.scm
+++ b/guix-build-coordinator/datastore/sqlite.scm
@@ -26,6 +26,7 @@
datastore-call-with-transaction
datastore-store-derivation
datastore-build-exists-for-derivation-outputs?
+ datastore-build-required-by-another?
datastore-list-related-derivations-with-no-build-for-outputs
datastore-list-failed-builds-with-blocking-count
datastore-list-builds-for-derivation-recursive-inputs
@@ -826,6 +827,46 @@ WHERE derivation_outputs.derivation_id = :derivation_id
#t
#f))))))
+(define-method (datastore-build-required-by-another?
+ (datastore <sqlite-datastore>)
+ uuid)
+ (call-with-worker-thread
+ (slot-ref datastore 'worker-reader-thread-channel)
+ (lambda (db)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+SELECT 1
+FROM builds
+INNER JOIN derivation_outputs
+ ON builds.derivation_id = derivation_outputs.derivation_id
+INNER JOIN outputs ON derivation_outputs.output_id = outputs.id
+INNER JOIN derivation_outputs AS all_derivation_outputs
+ ON outputs.id = all_derivation_outputs.output_id
+INNER JOIN derivation_inputs
+ ON derivation_inputs.derivation_output_id = all_derivation_outputs.id
+INNER JOIN derivations AS dependent_derivations
+ ON dependent_derivations.id = derivation_inputs.derivation_id
+INNER JOIN builds AS dependent_builds
+ ON dependent_builds.derivation_id = dependent_derivations.id
+ AND dependent_builds.processed = 0
+ AND dependent_builds.canceled = 0
+WHERE builds.uuid = :uuid
+"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments
+ statement
+ #:uuid uuid)
+
+ (let ((result (sqlite-step statement)))
+ (sqlite-reset statement)
+
+ (if result
+ #t
+ #f))))))
+
(define-method (datastore-list-related-derivations-with-no-build-for-outputs
(datastore <sqlite-datastore>)
derivation)