aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/datastore/sqlite.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2022-04-23 22:55:17 +0100
committerChristopher Baines <mail@cbaines.net>2022-04-23 22:55:17 +0100
commitdad8a92770658d800920d534076f5475d52b9131 (patch)
tree98d2ac28126b002c0ac5f5fdae4092d35c4177bf /guix-build-coordinator/datastore/sqlite.scm
parent13a7765f090c37f895054bee059d68cbf205a0da (diff)
downloadbuild-coordinator-dad8a92770658d800920d534076f5475d52b9131.tar
build-coordinator-dad8a92770658d800920d534076f5475d52b9131.tar.gz
Guard against inserting unnecessary related builds
Diffstat (limited to 'guix-build-coordinator/datastore/sqlite.scm')
-rw-r--r--guix-build-coordinator/datastore/sqlite.scm37
1 files changed, 37 insertions, 0 deletions
diff --git a/guix-build-coordinator/datastore/sqlite.scm b/guix-build-coordinator/datastore/sqlite.scm
index 9ea2845..bbd9c28 100644
--- a/guix-build-coordinator/datastore/sqlite.scm
+++ b/guix-build-coordinator/datastore/sqlite.scm
@@ -22,6 +22,7 @@
datastore-update
datastore-call-with-transaction
datastore-store-derivation
+ datastore-build-exists-for-derivation-outputs?
datastore-list-related-derivations-with-no-build-for-outputs
datastore-list-failed-builds-with-blocking-count
datastore-list-builds-for-derivation-recursive-inputs
@@ -783,6 +784,42 @@ INSERT INTO agent_tags (agent_id, tag_id) VALUES (:agent_id, :tag_id)"
#t)
+(define-method (datastore-build-exists-for-derivation-outputs?
+ (datastore <sqlite-datastore>)
+ derivation)
+ (call-with-worker-thread
+ (slot-ref datastore 'worker-reader-thread-channel)
+ (lambda (db)
+ (let ((statement
+ (sqlite-prepare
+ db
+ "
+SELECT 1
+FROM derivation_outputs
+INNER JOIN derivation_outputs AS all_derivation_outputs
+ ON all_derivation_outputs.output_id = derivation_outputs.output_id
+INNER JOIN derivations
+ ON derivations.id = all_derivation_outputs.derivation_id
+INNER JOIN builds
+ ON builds.derivation_id = derivations.id
+WHERE derivation_outputs.derivation_id = :derivation_id
+ AND (SELECT system_id FROM derivations WHERE id = :derivation_id) =
+ derivations.system_id
+ AND builds.canceled = 0
+"
+ #:cache? #t)))
+
+ (sqlite-bind-arguments
+ statement
+ #:derivation_id (db-find-derivation-id db derivation))
+
+ (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)