aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <mail@cbaines.net>2023-04-02 20:48:19 +0100
committerChristopher Baines <mail@cbaines.net>2023-04-02 20:48:19 +0100
commit9fc74074e6e81aa6c9acd368bc4a6ee5eb9b45d2 (patch)
tree85e6a7f4cbd5ae28829def3b03d4a4dff2b4fbb3
parent7c5e7cc28752a50abdb9ecaa3c60ace76828d8f4 (diff)
downloadbuild-coordinator-9fc74074e6e81aa6c9acd368bc4a6ee5eb9b45d2.tar
build-coordinator-9fc74074e6e81aa6c9acd368bc4a6ee5eb9b45d2.tar.gz
Try to improve hook exception handling
This should lead to more concise backtraces at least although it may reintroduce the problem where backtraces lead to excessive memory usage.
-rw-r--r--guix-build-coordinator/coordinator.scm97
1 files changed, 48 insertions, 49 deletions
diff --git a/guix-build-coordinator/coordinator.scm b/guix-build-coordinator/coordinator.scm
index 54380f3..b022c76 100644
--- a/guix-build-coordinator/coordinator.scm
+++ b/guix-build-coordinator/coordinator.scm
@@ -31,6 +31,7 @@
#:use-module (ice-9 rdelim)
#:use-module (ice-9 format)
#:use-module (ice-9 atomic)
+ #:use-module (ice-9 control)
#:use-module (ice-9 threads)
#:use-module (ice-9 exceptions)
#:use-module (web uri)
@@ -1001,55 +1002,53 @@
#:labels '(event)))
(define (process-event id event arguments handler)
- (with-exception-handler
- (lambda (exn)
- (log-msg
- (build-coordinator-logger build-coordinator)
- 'ERROR
- "process-event " event " (" id ") exception: " exn)
- (metric-increment failure-counter-metric
- #:label-values
- `((event . ,event)))
- (core-guile-sleep 10))
- (lambda ()
- (log-msg (build-coordinator-logger build-coordinator)
- 'DEBUG
- "processing " event " event: " arguments)
- (with-throw-handler #t
- (lambda ()
- (call-with-duration-metric
- (build-coordinator-metrics-registry build-coordinator)
- "hook_duration_seconds"
- (lambda ()
- (apply handler build-coordinator arguments))
- #:labels '(event)
- #:label-values `((event . ,event))))
- (lambda args
- (apply log-msg (build-coordinator-logger build-coordinator)
- 'ERROR
- "error running " event " (" id ") hook: "
- args)
- ;; TODO: This seems to be causing the threads to get stuck and use
- ;; excessive amounts of memory :(
- ;; (backtrace)
- ))
- (log-msg (build-coordinator-logger build-coordinator)
- 'DEBUG
- event " handler finished")
- (datastore-delete-unprocessed-hook-event datastore id)
-
- ;; If this is the hook for a successful build, once the hook
- ;; completed successfully, delete the nar files for this build.
- (when (eq? 'build-success event)
- (match arguments
- ((build-id)
- (let ((data-location (build-data-location build-id)))
- (when (file-exists? data-location)
- (delete-file-recursively data-location))))))
- (metric-increment success-counter-metric
- #:label-values
- `((event . ,event))))
- #:unwind? #t))
+ (let/ec cancel
+ (with-exception-handler
+ (lambda (exn)
+ (log-msg (build-coordinator-logger build-coordinator)
+ 'ERROR
+ "error running " event " (" id ") hook: "
+ exn)
+ (let* ((stack (make-stack #t 3))
+ (backtrace
+ (call-with-output-string
+ (lambda (port)
+ (display-backtrace stack port)
+ (newline port)))))
+ (display
+ backtrace
+ (current-output-port)))
+ (metric-increment failure-counter-metric
+ #:label-values
+ `((event . ,event)))
+ (core-guile-sleep 10)
+ (cancel #f))
+ (lambda ()
+ (call-with-duration-metric
+ (build-coordinator-metrics-registry build-coordinator)
+ "hook_duration_seconds"
+ (lambda ()
+ (start-stack
+ 'hook
+ (apply handler build-coordinator arguments)))
+ #:labels '(event)
+ #:label-values `((event . ,event)))))
+ (log-msg (build-coordinator-logger build-coordinator)
+ 'DEBUG
+ event " handler finished")
+ (datastore-delete-unprocessed-hook-event datastore id)
+
+ ;; If this is the hook for a successful build, once the hook
+ ;; completed successfully, delete the nar files for this build.
+ (when (eq? 'build-success event)
+ (match arguments
+ ((build-id)
+ (let ((data-location (build-data-location build-id)))
+ (when (file-exists? data-location)
+ (delete-file-recursively data-location))))))
+ (metric-increment success-counter-metric
+ #:label-values
+ `((event . ,event)))))
(define (single-thread-process-events event-name handler)
(let ((mtx (make-mutex))