From e2422e358850f455100d8927483dbc35543fe706 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Sun, 10 Oct 2021 18:10:45 +0100 Subject: 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. --- guix-build-coordinator/coordinator.scm | 74 ++++++++++++++++++---------------- 1 file 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 -- cgit v1.2.3