aboutsummaryrefslogtreecommitdiff
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
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.
-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