aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2020-10-24 14:54:45 +0100
committerChristopher Baines <mail@cbaines.net>2020-10-24 14:54:45 +0100
commitd773cf49579af6a96736959e97314ce1218382e7 (patch)
tree19df1a610686a987aef0cb27147bbd4cca7aef73
parent10dee5481f12a6f4a53afaacc27277ba9461ffc4 (diff)
downloadbuild-coordinator-d773cf49579af6a96736959e97314ce1218382e7.tar
build-coordinator-d773cf49579af6a96736959e97314ce1218382e7.tar.gz
Better handle agent errors on the coordinator side
Things like the agent not having the log file, or an output. This will allow the agent to actually retry the relevant thing.
-rw-r--r--guix-build-coordinator/agent-messaging/http/server.scm31
-rw-r--r--guix-build-coordinator/coordinator.scm19
2 files changed, 31 insertions, 19 deletions
diff --git a/guix-build-coordinator/agent-messaging/http/server.scm b/guix-build-coordinator/agent-messaging/http/server.scm
index c9d70d6..a8e0d46 100644
--- a/guix-build-coordinator/agent-messaging/http/server.scm
+++ b/guix-build-coordinator/agent-messaging/http/server.scm
@@ -457,16 +457,21 @@ port. Also, the port used can be changed by passing the --port option.\n"
"not-found"
#:code 404))))
- (call-with-error-handling
- controller-thunk
- #:on-error 'backtrace
- #:post-error (lambda args
- (match method-and-path-components
- ((method path-components ...)
- (simple-format
- (current-error-port)
- "error: when processing: /~A ~A\n"
- method (string-join path-components "/"))))
- (render-json
- `((error . ,(simple-format #f "~A" args)))
- #:code 500))))
+ (with-exception-handler
+ (lambda (exn)
+ (match method-and-path-components
+ ((method path-components ...)
+ (simple-format
+ (current-error-port)
+ "error: when processing: /~A ~A\n"
+ method (string-join path-components "/"))))
+ (if (agent-error? exn)
+ (render-json
+ `((error . ,(agent-error-details exn)))
+ #:code 400)
+ (render-json
+ `((error . ,(simple-format #f "~A" exn)))
+ #:code 500)))
+ controller-thunk
+ #:unwind? #t))
+
diff --git a/guix-build-coordinator/coordinator.scm b/guix-build-coordinator/coordinator.scm
index 62d181b..bc742cf 100644
--- a/guix-build-coordinator/coordinator.scm
+++ b/guix-build-coordinator/coordinator.scm
@@ -42,7 +42,10 @@
#:use-module (guix-build-coordinator build-allocator)
#:use-module (guix-build-coordinator agent-messaging http server)
#:use-module (guix-build-coordinator client-communication)
- #:export (make-build-coordinator
+ #:export (agent-error?
+ agent-error-details
+
+ make-build-coordinator
build-coordinator-datastore
build-coordinator-hooks
build-coordinator-metrics-registry
@@ -68,6 +71,11 @@
handle-build-result
handle-setup-failure-report))
+(define-exception-type &agent-error &error
+ make-agent-error
+ agent-error?
+ (details agent-error-details))
+
(define-record-type <build-coordinator>
(make-build-coordinator-record datastore hooks metrics-registry
allocation-strategy)
@@ -527,12 +535,12 @@
(let ((build-details (datastore-find-build datastore build-id)))
(when (assq-ref build-details 'processed)
(raise-exception
- (make-exception-with-message "build already processed"))))
+ (make-agent-error 'build_already_processed))))
(when success?
(unless (build-log-file-location build-id)
(raise-exception
- (make-exception-with-message "missing build log file")))
+ (make-agent-error 'missing_build_log_file)))
(for-each
(lambda (output)
@@ -541,9 +549,8 @@
(assq-ref output 'name))))
(unless (file-exists? output-location)
(raise-exception
- (make-exception-with-message
- (simple-format #f "missing output ~A"
- (assq-ref output 'name)))))))
+ (make-agent-error
+ `((missing_output . ,(assq-ref output 'name))))))))
(datastore-list-build-outputs datastore build-id)))
(datastore-store-build-result datastore