aboutsummaryrefslogtreecommitdiff
path: root/guix-build-coordinator/coordinator.scm
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2021-01-16 17:53:32 +0000
committerChristopher Baines <mail@cbaines.net>2021-01-16 17:53:32 +0000
commitef3b1a35ba68fbe7134d5dc5abb4f8441c4b4e3d (patch)
tree5d32e3179fc2ae059d881b8139b6c1eb4f53e6a5 /guix-build-coordinator/coordinator.scm
parent9051478c09c79ac8b91cb844b4f24352cb8d81fc (diff)
downloadbuild-coordinator-ef3b1a35ba68fbe7134d5dc5abb4f8441c4b4e3d.tar
build-coordinator-ef3b1a35ba68fbe7134d5dc5abb4f8441c4b4e3d.tar.gz
Move the build result storing logic in to the coordinator module
And out of the datastore. This means that datastore code doesn't have too much logic in it.
Diffstat (limited to 'guix-build-coordinator/coordinator.scm')
-rw-r--r--guix-build-coordinator/coordinator.scm71
1 files changed, 58 insertions, 13 deletions
diff --git a/guix-build-coordinator/coordinator.scm b/guix-build-coordinator/coordinator.scm
index 5e56f09..0dfcf98 100644
--- a/guix-build-coordinator/coordinator.scm
+++ b/guix-build-coordinator/coordinator.scm
@@ -749,19 +749,64 @@
`((missing_output . ,(assq-ref output 'name))))))))
(datastore-list-build-outputs datastore build-id)))
- (datastore-store-build-result datastore
- build-id
- agent-id
- (if success?
- "success"
- "failure")
- #f ; failure reason, TODO
- (if success?
- (vector->list
- (assoc-ref result-json "outputs"))
- #f)
- ;; TODO Check what the value of this is
- (assoc-ref result-json "end_time"))
+ (let ((exception
+ (datastore-call-with-transaction
+ 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-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
+ (raise-exception exception)))
+
+ (metric-increment
+ (metrics-registry-fetch-metric (slot-ref datastore 'metrics-registry)
+ "build_results_total")
+ #:label-values `((agent_id . ,agent-id)
+ (result . ,result)))
+
(build-coordinator-prompt-hook-processing-for-event
build-coordinator
(if success?