aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/coordinator.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2021-10-10 18:10:45 +0100
committerChristopher Baines <mail@cbaines.net>2021-10-10 18:10:45 +0100
commite2422e358850f455100d8927483dbc35543fe706 (patch)
treea9fde6d4cca6e665b71c82399d500b26c3b82576 /guix-build-coordinator/coordinator.scm
parent76d129dc19cc0e14441ae3a74bbc44e3be570b21 (diff)
downloadbuild-coordinator-e2422e358850f455100d8927483dbc35543fe706.tar
build-coordinator-e2422e358850f455100d8927483dbc35543fe706.tar.gz
Speed up storing builds
By moving looking up derivation outputs with no build to before the transaction that writes to the database, as this will allow for more concurrency.
Diffstat (limited to 'guix-build-coordinator/coordinator.scm')
-rw-r--r--guix-build-coordinator/coordinator.scm74
1 files changed, 39 insertions, 35 deletions
diff --git a/guix-build-coordinator/coordinator.scm b/guix-build-coordinator/coordinator.scm
index 2367d40..c95099d 100644
--- a/guix-build-coordinator/coordinator.scm
+++ b/guix-build-coordinator/coordinator.scm
@@ -322,38 +322,34 @@
(or requested-uuid
(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
- (datastore-list-related-derivations-with-no-build-for-outputs
- datastore
- derivation-file)))
- (for-each
- (lambda (related-derivation)
- (let ((related-uuid (random-v4-uuid)))
- (simple-format #t "submtiting ~A for related ~A\n"
- related-uuid
- related-derivation)
- (store-build related-derivation
+ (define (build-perform-datastore-changes derivations-lacking-builds)
+ (lambda (_)
+ (unless (datastore-find-derivation datastore derivation-file)
+ (datastore-store-derivation
+ datastore
+ (read-derivation-from-file derivation-file)))
+
+ (for-each
+ (lambda (related-derivation)
+ (let ((related-uuid (random-v4-uuid)))
+ (simple-format #t "submtiting ~A for related ~A\n"
related-uuid
- ;; Let the scheduler take care of
- ;; the prioritisation
- 0
- tags)))
- derivations-lacking-builds)))
-
- (store-build derivation-file
- build-id
- priority
- tags)
-
- #t)
+ related-derivation)
+ (store-build related-derivation
+ related-uuid
+ ;; Let the scheduler take care of
+ ;; the prioritisation
+ 0
+ tags)))
+ derivations-lacking-builds)
+
+ ;; Actually create a build
+ (store-build derivation-file
+ build-id
+ priority
+ tags)
+
+ #t))
(call-with-duration-metric
(build-coordinator-metrics-registry build-coordinator)
@@ -366,10 +362,18 @@
(build-for-output-already-exists?))
'((no-build-submitted . build-already-exists-for-a-output))
(begin
- (datastore-call-with-transaction datastore
- perform-datastore-changes
- #:duration-metric-name
- "store_build")
+ (datastore-call-with-transaction
+ datastore
+ (build-perform-datastore-changes
+ (if ensure-all-related-derivation-outputs-have-builds?
+ ;; Do this here so it doesn't take time in the writer
+ ;; thread
+ (datastore-list-related-derivations-with-no-build-for-outputs
+ datastore
+ derivation-file)
+ '()))
+ #:duration-metric-name
+ "store_build")
(build-coordinator-prompt-hook-processing-for-event
build-coordinator