download: Enlarge your receive buffer.

* guix/build/download.scm (open-connection-for-uri): Remove call to
  'setsockopt'.
* guix/http-client.scm (open-socket-for-uri)[rmem-max, buffer-size]: New
  variables.  Add call to 'setsockopt'.
This commit is contained in:
Ludovic Courtès 2014-05-23 22:19:37 +02:00
parent fb729425dc
commit a68d976b66
2 changed files with 12 additions and 2 deletions

View file

@ -167,8 +167,6 @@ (define addresses
;; Buffer input and output on this port. ;; Buffer input and output on this port.
(setvbuf s _IOFBF) (setvbuf s _IOFBF)
;; Enlarge the receive buffer.
(setsockopt s SOL_SOCKET SO_RCVBUF (* 12 1024))
(if (eq? 'https (uri-scheme uri)) (if (eq? 'https (uri-scheme uri))
(tls-wrap s) (tls-wrap s)

View file

@ -162,7 +162,19 @@ (define bad-response
(define* (open-socket-for-uri uri #:key (buffered? #t)) (define* (open-socket-for-uri uri #:key (buffered? #t))
"Return an open port for URI. When BUFFERED? is false, the returned port is "Return an open port for URI. When BUFFERED? is false, the returned port is
unbuffered." unbuffered."
(define rmem-max
;; The maximum size for a receive buffer on Linux, see socket(7).
"/proc/sys/net/core/rmem_max")
(define buffer-size
(if (file-exists? rmem-max)
(call-with-input-file rmem-max read)
126976)) ; the default for Linux, per 'rmem_default'
(let ((s ((@ (web client) open-socket-for-uri) uri))) (let ((s ((@ (web client) open-socket-for-uri) uri)))
;; Work around <http://bugs.gnu.org/15368> by restoring a decent
;; buffer size.
(setsockopt s SOL_SOCKET SO_RCVBUF buffer-size)
(unless buffered? (unless buffered?
(setvbuf s _IONBF)) (setvbuf s _IONBF))
s)) s))