Skip to content
Snippets Groups Projects
Commit bb225189 authored by Christopher Baines's avatar Christopher Baines
Browse files

utils: Handle errors in worker threads.

Previously, if an error occurred, the worker fiber simply never sends a
reply. In the case of HTTP requests to Cuirass, where an exception occurs when
performing a database query, the fiber handling the request blocks as it never
gets a response. I think that this has the potential to cause the process to
hit file descriptor limits, as the connections are never responded to.

This is fixed by responding with the details of the exception, and then
throwing it within the fiber that made the call.

* src/cuirass/utils.scm (make-worker-thread-channel): Catch exceptions when
calling proc.
(call-with-worker-thread): Handle receiving exceptions from the worker thread.
parent b9031db9
No related branches found
No related tags found
No related merge requests found
......@@ -114,7 +114,12 @@ arguments of the worker thread procedure."
(let loop ()
(match (get-message channel)
(((? channel? reply) . (? procedure? proc))
(put-message reply (apply proc args))))
(put-message reply
(catch #t
(lambda ()
(apply proc args))
(lambda (key . args)
(cons* 'worker-thread-error key args))))))
(loop)))))))
(iota parallelism))
channel)))
......@@ -127,7 +132,10 @@ If already in the worker thread, call PROC immediately."
(apply proc args)
(let ((reply (make-channel)))
(put-message channel (cons reply proc))
(get-message reply)))))
(match (get-message reply)
(('worker-thread-error key args ...)
(apply throw key args))
(result result))))))
(define-syntax-rule (with-worker-thread channel (vars ...) exp ...)
"Evaluate EXP... in the worker thread corresponding to CHANNEL.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment