aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/coordinator.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2023-04-24 11:36:00 +0100
committerChristopher Baines <mail@cbaines.net>2023-04-24 11:36:15 +0100
commit98b1fa1af90c2058d28a30228fb4bd7486abd16e (patch)
tree1d77950ee48874cb860db3d18917cb70dbd90aa5 /guix-build-coordinator/coordinator.scm
parent611ffdf5a8b1f658d29dcfd93e92028ee15a02a3 (diff)
downloadbuild-coordinator-98b1fa1af90c2058d28a30228fb4bd7486abd16e.tar
build-coordinator-98b1fa1af90c2058d28a30228fb4bd7486abd16e.tar.gz
Avoid attempting to process build results twice
The subsequent attempts fail due to the database constraints, but detecting this in the application is more elegant.
Diffstat (limited to 'guix-build-coordinator/coordinator.scm')
-rw-r--r--guix-build-coordinator/coordinator.scm91
1 files changed, 46 insertions, 45 deletions
diff --git a/guix-build-coordinator/coordinator.scm b/guix-build-coordinator/coordinator.scm
index 02bca86..a2d430b 100644
--- a/guix-build-coordinator/coordinator.scm
+++ b/guix-build-coordinator/coordinator.scm
@@ -1478,51 +1478,52 @@
datastore
(lambda _
(let ((build-details (datastore-find-build datastore build-id)))
- (if
- (assq-ref build-details 'canceled)
- (begin
- (datastore-remove-build-allocation datastore
- build-id agent-id)
-
- (make-agent-error
- 'cannot_store_result_for_canceled_build))
- (begin
- (datastore-insert-build-result datastore
- build-id
- agent-id
- (if success?
- "success"
- "failure")
- #f) ; failure-reason TODO
- (datastore-remove-build-allocation datastore
- build-id agent-id)
- (datastore-mark-build-as-processed
- datastore
- build-id
- ;; TODO Check what the value of this is
- (assoc-ref result-json "end_time"))
-
- (datastore-insert-unprocessed-hook-event
- datastore
- (if (string=? result "success")
- "build-success"
- "build-failure")
- (list build-id))
-
- (when success?
- (datastore-delete-relevant-outputs-from-unbuilt-outputs
- datastore
- build-id)
- (datastore-update-unprocessed-builds-for-build-success
- datastore
- build-id)
- (datastore-store-output-metadata
- datastore
- build-id
- (vector->list
- (assoc-ref result-json "outputs"))))
-
- #f))))
+ (cond
+ ((assq-ref build-details 'processed)
+ (make-agent-error 'build_already_processed))
+ ((assq-ref build-details 'canceled)
+ (datastore-remove-build-allocation datastore
+ build-id agent-id)
+
+ (make-agent-error
+ 'cannot_store_result_for_canceled_build))
+ (else
+ (datastore-insert-build-result datastore
+ build-id
+ agent-id
+ (if success?
+ "success"
+ "failure")
+ #f) ; failure-reason TODO
+ (datastore-remove-build-allocation datastore
+ build-id agent-id)
+ (datastore-mark-build-as-processed
+ datastore
+ build-id
+ ;; TODO Check what the value of this is
+ (assoc-ref result-json "end_time"))
+
+ (datastore-insert-unprocessed-hook-event
+ datastore
+ (if (string=? result "success")
+ "build-success"
+ "build-failure")
+ (list build-id))
+
+ (when success?
+ (datastore-delete-relevant-outputs-from-unbuilt-outputs
+ datastore
+ build-id)
+ (datastore-update-unprocessed-builds-for-build-success
+ datastore
+ build-id)
+ (datastore-store-output-metadata
+ datastore
+ build-id
+ (vector->list
+ (assoc-ref result-json "outputs"))))
+
+ #f))))
#:duration-metric-name "store_build_result")))
(when exception
;; Raise the exception here to avoid aborting the transaction