diff options
author | Christopher Baines <mail@cbaines.net> | 2021-01-16 17:53:32 +0000 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2021-01-16 17:53:32 +0000 |
commit | ef3b1a35ba68fbe7134d5dc5abb4f8441c4b4e3d (patch) | |
tree | 5d32e3179fc2ae059d881b8139b6c1eb4f53e6a5 /guix-build-coordinator/coordinator.scm | |
parent | 9051478c09c79ac8b91cb844b4f24352cb8d81fc (diff) | |
download | build-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.scm | 71 |
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? |