daemon: Client settings no longer override daemon settings.

Fixes <http://bugs.gnu.org/20217>.

* nix/libstore/worker-protocol.hh (PROTOCOL_VERSION): Bump to 0x161.
* nix/nix-daemon/nix-daemon.cc (performOp): "build-max-jobs",
"build-max-silent-time", and "build-cores" are no longer read upfront;
instead, read them from the key/value list at the end.
* nix/nix-daemon/guix-daemon.cc (main): Explicitly set
'settings.maxBuildJobs'.
* guix/store.scm (%protocol-version): Bump to #x161.
(set-build-options): #:max-build-jobs, #:max-silent-time, and
 #:build-cores now default to #f.  Adjust handshake to new protocol.
* tests/store.scm ("build-cores"): New test.
* tests/guix-daemon.sh: Add test for default "build-cores" value.
This commit is contained in:
Ludovic Courtès 2017-01-15 15:13:07 +01:00
parent 09cadc8e78
commit deac976d3d
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
6 changed files with 95 additions and 18 deletions

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -138,7 +138,7 @@ (define-module (guix store)
direct-store-path direct-store-path
log-file)) log-file))
(define %protocol-version #x10f) (define %protocol-version #x161)
(define %worker-magic-1 #x6e697863) ; "nixc" (define %worker-magic-1 #x6e697863) ; "nixc"
(define %worker-magic-2 #x6478696f) ; "dxio" (define %worker-magic-2 #x6478696f) ; "dxio"
@ -537,14 +537,14 @@ (define* (set-build-options server
#:key keep-failed? keep-going? fallback? #:key keep-failed? keep-going? fallback?
(verbosity 0) (verbosity 0)
rounds ;number of build rounds rounds ;number of build rounds
(max-build-jobs 1) max-build-jobs
timeout timeout
(max-silent-time 3600) max-silent-time
(use-build-hook? #t) (use-build-hook? #t)
(build-verbosity 0) (build-verbosity 0)
(log-type 0) (log-type 0)
(print-build-trace #t) (print-build-trace #t)
(build-cores (current-processor-count)) build-cores
(use-substitutes? #t) (use-substitutes? #t)
;; Client-provided substitute URLs. If it is #f, ;; Client-provided substitute URLs. If it is #f,
@ -570,21 +570,37 @@ (define socket
...))))) ...)))))
(write-int (operation-id set-options) socket) (write-int (operation-id set-options) socket)
(send (boolean keep-failed?) (boolean keep-going?) (send (boolean keep-failed?) (boolean keep-going?)
(boolean fallback?) (integer verbosity) (boolean fallback?) (integer verbosity))
(integer max-build-jobs) (integer max-silent-time)) (when (< (nix-server-minor-version server) #x61)
(let ((max-build-jobs (or max-build-jobs 1))
(max-silent-time (or max-silent-time 3600)))
(send (integer max-build-jobs) (integer max-silent-time))))
(when (>= (nix-server-minor-version server) 2) (when (>= (nix-server-minor-version server) 2)
(send (boolean use-build-hook?))) (send (boolean use-build-hook?)))
(when (>= (nix-server-minor-version server) 4) (when (>= (nix-server-minor-version server) 4)
(send (integer build-verbosity) (integer log-type) (send (integer build-verbosity) (integer log-type)
(boolean print-build-trace))) (boolean print-build-trace)))
(when (>= (nix-server-minor-version server) 6) (when (and (>= (nix-server-minor-version server) 6)
(send (integer build-cores))) (< (nix-server-minor-version server) #x61))
(let ((build-cores (or build-cores (current-processor-count))))
(send (integer build-cores))))
(when (>= (nix-server-minor-version server) 10) (when (>= (nix-server-minor-version server) 10)
(send (boolean use-substitutes?))) (send (boolean use-substitutes?)))
(when (>= (nix-server-minor-version server) 12) (when (>= (nix-server-minor-version server) 12)
(let ((pairs `(,@(if timeout (let ((pairs `(,@(if timeout
`(("build-timeout" . ,(number->string timeout))) `(("build-timeout" . ,(number->string timeout)))
'()) '())
,@(if max-silent-time
`(("build-max-silent-time"
. ,(number->string max-silent-time)))
'())
,@(if max-build-jobs
`(("build-max-jobs"
. ,(number->string max-build-jobs)))
'())
,@(if build-cores
`(("build-cores" . ,(number->string build-cores)))
'())
,@(if substitute-urls ,@(if substitute-urls
`(("substitute-urls" `(("substitute-urls"
. ,(string-join substitute-urls))) . ,(string-join substitute-urls)))

View file

@ -6,7 +6,7 @@ namespace nix {
#define WORKER_MAGIC_1 0x6e697863 #define WORKER_MAGIC_1 0x6e697863
#define WORKER_MAGIC_2 0x6478696f #define WORKER_MAGIC_2 0x6478696f
#define PROTOCOL_VERSION 0x160 #define PROTOCOL_VERSION 0x161
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00) #define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff) #define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)

View file

@ -1,5 +1,5 @@
/* GNU Guix --- Functional package management for GNU /* GNU Guix --- Functional package management for GNU
Copyright (C) 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> Copyright (C) 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
This file is part of GNU Guix. This file is part of GNU Guix.
@ -301,8 +301,9 @@ main (int argc, char *argv[])
/* Turn automatic deduplication on by default. */ /* Turn automatic deduplication on by default. */
settings.autoOptimiseStore = true; settings.autoOptimiseStore = true;
/* Default to using as many cores as possible. */ /* Default to using as many cores as possible and one job at a time. */
settings.buildCores = 0; settings.buildCores = 0;
settings.maxBuildJobs = 1;
argvSaved = argv; argvSaved = argv;

View file

@ -549,8 +549,12 @@ static void performOp(bool trusted, unsigned int clientVersion,
settings.keepGoing = readInt(from) != 0; settings.keepGoing = readInt(from) != 0;
settings.set("build-fallback", readInt(from) ? "true" : "false"); settings.set("build-fallback", readInt(from) ? "true" : "false");
verbosity = (Verbosity) readInt(from); verbosity = (Verbosity) readInt(from);
settings.set("build-max-jobs", std::to_string(readInt(from)));
settings.set("build-max-silent-time", std::to_string(readInt(from))); if (GET_PROTOCOL_MINOR(clientVersion) < 0x61) {
settings.set("build-max-jobs", std::to_string(readInt(from)));
settings.set("build-max-silent-time", std::to_string(readInt(from)));
}
if (GET_PROTOCOL_MINOR(clientVersion) >= 2) if (GET_PROTOCOL_MINOR(clientVersion) >= 2)
settings.useBuildHook = readInt(from) != 0; settings.useBuildHook = readInt(from) != 0;
if (GET_PROTOCOL_MINOR(clientVersion) >= 4) { if (GET_PROTOCOL_MINOR(clientVersion) >= 4) {
@ -558,7 +562,8 @@ static void performOp(bool trusted, unsigned int clientVersion,
logType = (LogType) readInt(from); logType = (LogType) readInt(from);
settings.printBuildTrace = readInt(from) != 0; settings.printBuildTrace = readInt(from) != 0;
} }
if (GET_PROTOCOL_MINOR(clientVersion) >= 6) if (GET_PROTOCOL_MINOR(clientVersion) >= 6
&& GET_PROTOCOL_MINOR(clientVersion) < 0x61)
settings.set("build-cores", std::to_string(readInt(from))); settings.set("build-cores", std::to_string(readInt(from)));
if (GET_PROTOCOL_MINOR(clientVersion) >= 10) if (GET_PROTOCOL_MINOR(clientVersion) >= 10)
settings.set("build-use-substitutes", readInt(from) ? "true" : "false"); settings.set("build-use-substitutes", readInt(from) ? "true" : "false");
@ -567,7 +572,10 @@ static void performOp(bool trusted, unsigned int clientVersion,
for (unsigned int i = 0; i < n; i++) { for (unsigned int i = 0; i < n; i++) {
string name = readString(from); string name = readString(from);
string value = readString(from); string value = readString(from);
if (name == "build-timeout" || name == "build-repeat" || name == "use-ssh-substituter") if (name == "build-timeout" || name == "build-max-silent-time"
|| name == "build-max-jobs" || name == "build-cores"
|| name == "build-repeat"
|| name == "use-ssh-substituter")
settings.set(name, value); settings.set(name, value);
else else
settings.set(trusted ? name : "untrusted-" + name, value); settings.set(trusted ? name : "untrusted-" + name, value);

View file

@ -1,5 +1,5 @@
# GNU Guix --- Functional package management for GNU # GNU Guix --- Functional package management for GNU
# Copyright © 2012, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> # Copyright © 2012, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
# #
# This file is part of GNU Guix. # This file is part of GNU Guix.
# #
@ -118,3 +118,30 @@ guile -c "
(clear-failed-paths store (list out)) (clear-failed-paths store (list out))
(null? (query-failed-paths store))))))) (null? (query-failed-paths store)))))))
#:guile-for-build (%guile-for-build)) " #:guile-for-build (%guile-for-build)) "
kill "$daemon_pid"
# Make sure the daemon's default 'build-cores' setting is honored.
guix-daemon --listen="$socket" --disable-chroot --cores=42 &
daemon_pid=$!
GUIX_DAEMON_SOCKET="$socket" \
guile -c '
(use-modules (guix) (gnu packages) (guix tests))
(with-store store
(let* ((build (add-text-to-store store "build.sh"
"echo $NIX_BUILD_CORES > $out"))
(bash (add-to-store store "bash" #t "sha256"
(search-bootstrap-binary "bash"
(%current-system))))
(drv (derivation store "the-thing" bash
`("-e" ,build)
#:inputs `((,bash) (,build))
#:env-vars `(("x" . ,(random-text))))))
(and (build-derivations store (list drv))
(exit
(= 42 (pk (call-with-input-file (derivation->output-path drv)
read)))))))'

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -948,4 +948,29 @@ (define ref-hash
(string=? (derivation-file-name d) (string=? (derivation-file-name d)
(path-info-deriver (query-path-info %store o)))))) (path-info-deriver (query-path-info %store o))))))
(test-equal "build-cores"
(list 0 42)
(with-store store
(let* ((build (add-text-to-store store "build.sh"
"echo $NIX_BUILD_CORES > $out"))
(bash (add-to-store store "bash" #t "sha256"
(search-bootstrap-binary "bash"
(%current-system))))
(drv1 (derivation store "the-thing" bash
`("-e" ,build)
#:inputs `((,bash) (,build))
#:env-vars `(("x" . ,(random-text)))))
(drv2 (derivation store "the-thing" bash
`("-e" ,build)
#:inputs `((,bash) (,build))
#:env-vars `(("x" . ,(random-text))))))
(and (build-derivations store (list drv1))
(begin
(set-build-options store #:build-cores 42)
(build-derivations store (list drv2)))
(list (call-with-input-file (derivation->output-path drv1)
read)
(call-with-input-file (derivation->output-path drv2)
read))))))
(test-end "store") (test-end "store")