From d6d62e3e0eb61fb4c6b9b9f5f8c8636e23b73d60 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Fri, 21 May 2021 20:29:43 +0100 Subject: 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. --- guix-build-coordinator/client-communication.scm | 5 +---- guix-build-coordinator/coordinator.scm | 24 +++++++++++++++++++++--- 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 -- cgit v1.2.3