Ludovic Courtès writes: > Hi, > > Christopher Baines skribis: > >> For some applications, it's important to establish a non-blocking connection >> rather than just making the socket non-blocking after the connection is >> established. This is because there is I/O on the socket that will block during >> the handshake. >> >> I've noticed this blocking during the handshake causing issues in the build >> coordinator for example. >> >> This commit adds a new with-store variant to avoid changing the behaviour of >> with-store/open-connection to ensure that this change can't break anything >> that depends on the blocking nature of the socket. >> >> * guix/store.scm (open-unix-domain-socket, open-inet-socket): Take >> #:non-blocking? and use SOCK_NONBLOCK when calling socket if appropriate. >> (connect-to-daemon, open-connection, call-with-store): Take #:non-blocking? >> and pass it on. >> (with-store/non-blocking): New syntax rule. >> >> Change-Id: I8225762b78448bc1f7b698c8de5d736e13f577bf > > [...] > >> +(define* (open-unix-domain-socket file #:key non-blocking?) >> "Connect to the Unix-domain socket at FILE and return it. Raise a >> -'&store-connection-error' upon error." >> +'&store-connection-error' upon error. If NON-BLOCKING?, make the socket >> +non-blocking." >> (let ((s (with-fluids ((%default-port-encoding #f)) >> ;; This trick allows use of the `scm_c_read' optimization. >> - (socket PF_UNIX (logior SOCK_STREAM SOCK_CLOEXEC) 0))) >> + (socket PF_UNIX >> + (logior SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK) >> + 0))) > > Make sure SOCK_NONBLOCK is added only when ‘non-blocking?’ is true. Ah, yep, I've fixed this now. >> +(define-syntax-rule (with-store/non-blocking store exp ...) >> + "Bind STORE to an non-blocking open connection to the store and evaluate >> +EXPs; automatically close the store when the dynamic extent of EXP is left." >> + (call-with-store (lambda (store) exp ...) #:non-blocking? #t)) > > I think we’ll need an entry in ‘.dir-locals.el’ and one in (guix > read-print) for proper formatting. I've added an entry in to .dir-locals.el, but unless I've missed something, (guix read-print) doesn't handle with-store so maybe we need to add with-store and with-store/non-blocking. > OK for me with these changes! Great, I've pushed to 3db1a8341c815af3673c367518fbb193f5592864 and I can follow up with the (guix read-print) changes and updating the guix package later. Thanks, Chris