diff options
author | Christopher Baines <mail@cbaines.net> | 2023-04-24 11:36:00 +0100 |
---|---|---|
committer | Christopher Baines <mail@cbaines.net> | 2023-04-24 11:36:15 +0100 |
commit | 98b1fa1af90c2058d28a30228fb4bd7486abd16e (patch) | |
tree | 1d77950ee48874cb860db3d18917cb70dbd90aa5 /guix-build-coordinator/coordinator.scm | |
parent | 611ffdf5a8b1f658d29dcfd93e92028ee15a02a3 (diff) | |
download | build-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.scm | 91 |
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 |