diff options
author | Ludovic Courtès <ludo@gnu.org> | 2020-10-27 18:55:54 +0100 |
---|---|---|
committer | Mathieu Othacehe <othacehe@gnu.org> | 2020-10-27 19:00:31 +0100 |
commit | 387909454c835c994414aa740a2d33d288064158 (patch) | |
tree | 879dda677b6d3f91003bcea54b56583d84890d0e | |
parent | f141dd205a3f818790de346e6c99d9d898057c05 (diff) | |
download | cuirass-387909454c835c994414aa740a2d33d288064158.tar cuirass-387909454c835c994414aa740a2d33d288064158.tar.gz |
Use a non-blocking socket for store communication.
Set the store socket as non-blocking so that fibers communicating with the
store don't get blocked as described here: https://issues.guix.gnu.org/43565.
* src/cuirass/base.scm (with-store): Set the store socket as non-blocking.
(build-derivations&): Unset current-read-waiter and current-write-waiter.
-rw-r--r-- | src/cuirass/base.scm | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/cuirass/base.scm b/src/cuirass/base.scm index 1966ad6..7f4cc3c 100644 --- a/src/cuirass/base.scm +++ b/src/cuirass/base.scm @@ -36,6 +36,9 @@ #:use-module ((guix config) #:select (%state-directory)) #:use-module (git) #:use-module (ice-9 binary-ports) + #:use-module ((ice-9 suspendable-ports) + #:select (current-read-waiter + current-write-waiter)) #:use-module (ice-9 format) #:use-module (ice-9 match) #:use-module (ice-9 popen) @@ -79,7 +82,12 @@ ;; currently closes in a 'dynamic-wind' handler, which means it would close ;; the store at each context switch. Remove this when the real 'with-store' ;; has been fixed. - (let ((store (open-connection))) + (let* ((store (open-connection)) + (socket (store-connection-socket store))) + ;; Mark SOCKET as non-blocking so Fibers can schedule the way it wants. + (let ((flags (fcntl socket F_GETFL))) + (fcntl socket F_SETFL (logior O_NONBLOCK flags))) + (unwind-protect ;; Always set #:keep-going? so we don't stop on the first build failure. ;; Set #:print-build-trace explicitly to make sure 'process-build-log' @@ -422,7 +430,12 @@ Essentially this procedure inverts the inversion-of-control that (lambda () (guard (c ((store-error? c) (atomic-box-set! result c))) - (parameterize ((current-build-output-port output)) + (parameterize ((current-build-output-port output) + + ;; STORE's socket is O_NONBLOCK but since we're + ;; not in a fiber, disable Fiber's handlers. + (current-read-waiter #f) + (current-write-waiter #f)) (let ((x (build-derivations store lst))) (atomic-box-set! result x)))) (close-port output)) |