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'.
This commit is contained in:
Ludovic Courtès 2017-05-05 15:32:16 +02:00 committed by Ludovic Courtès
parent 74b8671378
commit 950d51c9d9
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -382,6 +382,11 @@ (define (open-unix-domain-socket file)
(define (open-inet-socket host port) (define (open-inet-socket host port)
"Connect to the Unix-domain socket at HOST:PORT and return it. Raise a "Connect to the Unix-domain socket at HOST:PORT and return it. Raise a
'&nix-connection-error' upon error." '&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)) (let ((sock (with-fluids ((%default-port-encoding #f))
;; This trick allows use of the `scm_c_read' optimization. ;; This trick allows use of the `scm_c_read' optimization.
(socket PF_UNIX SOCK_STREAM 0)))) (socket PF_UNIX SOCK_STREAM 0))))
@ -402,6 +407,10 @@ (define addresses
(catch 'system-error (catch 'system-error
(lambda () (lambda ()
(connect s (addrinfo:addr ai)) (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) s)
(lambda args (lambda args
;; Connection failed, so try one of the other addresses. ;; Connection failed, so try one of the other addresses.