From 950d51c9d9a5107c5dac279da7d2e431134b5f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 5 May 2017 15:32:16 +0200 Subject: [PATCH] store: Use 'TCP_NODELAY' when connecting to a daemon over PF_INET. * guix/store.scm (open-inet-socket): Add 'cond-expand' form to define 'TCP_NODELAY' when needed. Add call to 'setsockopt' after 'connect'. --- guix/store.scm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/guix/store.scm b/guix/store.scm index b71c47b9bb..c94dfea959 100644 --- a/guix/store.scm +++ b/guix/store.scm @@ -382,6 +382,11 @@ (define (open-inet-socket host port) "Connect to the Unix-domain socket at HOST:PORT and return it. Raise a '&nix-connection-error' upon error." + ;; Define 'TCP_NODELAY' on Guile 2.0. The value is the same on all GNU + ;; systems. + (cond-expand (guile-2.2 #t) + (else (define TCP_NODELAY 1))) + (let ((sock (with-fluids ((%default-port-encoding #f)) ;; This trick allows use of the `scm_c_read' optimization. (socket PF_UNIX SOCK_STREAM 0)))) @@ -402,6 +407,10 @@ (catch 'system-error (lambda () (connect s (addrinfo:addr ai)) + + ;; Setting this option makes a dramatic difference because it + ;; avoids the "ACK delay" on our RPC messages. + (setsockopt s IPPROTO_TCP TCP_NODELAY 1) s) (lambda args ;; Connection failed, so try one of the other addresses.