aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2021-05-21 20:29:43 +0100
committerChristopher Baines <mail@cbaines.net>2021-05-21 20:29:43 +0100
commitd6d62e3e0eb61fb4c6b9b9f5f8c8636e23b73d60 (patch)
tree97c2090d79d2c0fa63b5a931e1451db0ffb04f1f
parent671c5ed1596fd69a832a126c2efb5eaea17cf10f (diff)
downloadbuild-coordinator-d6d62e3e0eb61fb4c6b9b9f5f8c8636e23b73d60.tar
build-coordinator-d6d62e3e0eb61fb4c6b9b9f5f8c8636e23b73d60.tar.gz
Delay storing derivations in the database
Until actually storing the build, since the build might not actually be submitted if there's a build for those outputs already.
-rw-r--r--guix-build-coordinator/client-communication.scm5
-rw-r--r--guix-build-coordinator/coordinator.scm24
2 files changed, 22 insertions, 7 deletions
diff --git a/guix-build-coordinator/client-communication.scm b/guix-build-coordinator/client-communication.scm
index 3eb2f9e..bf27f93 100644
--- a/guix-build-coordinator/client-communication.scm
+++ b/guix-build-coordinator/client-communication.scm
@@ -378,10 +378,7 @@
(substitute-derivation derivation-file
#:substitute-urls
(and=> raw-substitute-urls
- vector->list))))))
- (datastore-store-derivation
- datastore
- (read-derivation-from-file derivation-file))))
+ vector->list))))))))
(let ((submit-build-result
(apply
diff --git a/guix-build-coordinator/coordinator.scm b/guix-build-coordinator/coordinator.scm
index 7841502..2367d40 100644
--- a/guix-build-coordinator/coordinator.scm
+++ b/guix-build-coordinator/coordinator.scm
@@ -274,8 +274,21 @@
0))
(define (build-for-output-already-exists?)
- (let ((system (datastore-find-derivation-system datastore
- derivation-file)))
+ ;; Handle the derivation not existing in the database here, so that adding
+ ;; it to the database isn't required for this code to work
+ (let ((system (or (datastore-find-derivation-system datastore
+ derivation-file)
+ (derivation-system
+ (read-derivation-from-file derivation-file))))
+ (outputs (or (datastore-find-derivation-outputs datastore
+ derivation-file)
+ (map
+ (match-lambda
+ ((name . output)
+ `((name . ,name)
+ (output . ,(derivation-output-path output)))))
+ (derivation-outputs
+ (read-derivation-from-file derivation-file))))))
(any
(lambda (output-details)
(let ((builds-for-output
@@ -285,7 +298,7 @@
system
#:include-canceled? #f)))
(not (null? builds-for-output))))
- (datastore-find-derivation-outputs datastore derivation-file))))
+ outputs)))
(define (store-build derivation-name
uuid
@@ -310,6 +323,11 @@
(random-v4-uuid)))
(define (perform-datastore-changes db)
+ (unless (datastore-find-derivation datastore derivation-file)
+ (datastore-store-derivation
+ datastore
+ (read-derivation-from-file derivation-file)))
+
;; Actually create a build
(when ensure-all-related-derivation-outputs-have-builds?
(let ((derivations-lacking-builds