daemon: Add '--timeout' and '--max-silent-time'.

* nix/nix-daemon/guix-daemon.cc (GUIX_OPT_TIMEOUT)
(GUIX_OPT_MAX_SILENT_TIME): New macros.
* nix/nix-daemon/guix-daemon.cc (options): Add '--timeout' and
'--max-silent-time'.
(parse_opt): Honor them.
* tests/guix-daemon.sh: Add test.
* doc/guix.texi (Invoking guix-daemon): Document the options.
(Common Build Options): Properly describe default
timeout/max-silent-time value.  Add cross-ref to "Invoking
guix-daemon".
This commit is contained in:
Ludovic Courtès 2017-06-03 23:55:31 +02:00
parent 20214f7115
commit 2ca9f51ec8
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
3 changed files with 71 additions and 2 deletions

View File

@ -1146,6 +1146,24 @@ Allow at most @var{n} build jobs in parallel. The default value is
locally; instead, the daemon will offload builds (@pxref{Daemon Offload locally; instead, the daemon will offload builds (@pxref{Daemon Offload
Setup}), or simply fail. Setup}), or simply fail.
@item --max-silent-time=@var{seconds}
When the build or substitution process remains silent for more than
@var{seconds}, terminate it and report a build failure.
The default value is @code{0}, which disables the timeout.
The value specified here can be overridden by clients (@pxref{Common
Build Options, @code{--max-silent-time}}).
@item --timeout=@var{seconds}
Likewise, when the build or substitution process lasts for more than
@var{seconds}, terminate it and report a build failure.
The default value is @code{0}, which disables the timeout.
The value specified here can be overridden by clients (@pxref{Common
Build Options, @code{--timeout}}).
@item --rounds=@var{N} @item --rounds=@var{N}
Build each derivation @var{n} times in a row, and raise an error if Build each derivation @var{n} times in a row, and raise an error if
consecutive build results are not bit-for-bit identical. Note that this consecutive build results are not bit-for-bit identical. Note that this
@ -4940,12 +4958,15 @@ instead of offloading builds to remote machines.
When the build or substitution process remains silent for more than When the build or substitution process remains silent for more than
@var{seconds}, terminate it and report a build failure. @var{seconds}, terminate it and report a build failure.
By default, the daemon's setting is honored (@pxref{Invoking
guix-daemon, @code{--max-silent-time}}).
@item --timeout=@var{seconds} @item --timeout=@var{seconds}
Likewise, when the build or substitution process lasts for more than Likewise, when the build or substitution process lasts for more than
@var{seconds}, terminate it and report a build failure. @var{seconds}, terminate it and report a build failure.
By default there is no timeout. This behavior can be restored with By default, the daemon's setting is honored (@pxref{Invoking
@code{--timeout=0}. guix-daemon, @code{--timeout}}).
@item --verbosity=@var{level} @item --verbosity=@var{level}
Use the given verbosity level. @var{level} must be an integer between 0 Use the given verbosity level. @var{level} must be an integer between 0

View File

@ -81,6 +81,8 @@ builds derivations on behalf of its clients.");
#define GUIX_OPT_GC_KEEP_OUTPUTS 15 #define GUIX_OPT_GC_KEEP_OUTPUTS 15
#define GUIX_OPT_GC_KEEP_DERIVATIONS 16 #define GUIX_OPT_GC_KEEP_DERIVATIONS 16
#define GUIX_OPT_BUILD_ROUNDS 17 #define GUIX_OPT_BUILD_ROUNDS 17
#define GUIX_OPT_TIMEOUT 18
#define GUIX_OPT_MAX_SILENT_TIME 19
static const struct argp_option options[] = static const struct argp_option options[] =
{ {
@ -91,6 +93,10 @@ static const struct argp_option options[] =
}, },
{ "max-jobs", 'M', n_("N"), 0, { "max-jobs", 'M', n_("N"), 0,
n_("allow at most N build jobs") }, n_("allow at most N build jobs") },
{ "timeout", GUIX_OPT_TIMEOUT, n_("SECONDS"), 0,
n_("mark builds as failed after SECONDS of activity") },
{ "max-silent-time", GUIX_OPT_MAX_SILENT_TIME, n_("SECONDS"), 0,
n_("mark builds as failed after SECONDS of silence") },
{ "disable-chroot", GUIX_OPT_DISABLE_CHROOT, 0, 0, { "disable-chroot", GUIX_OPT_DISABLE_CHROOT, 0, 0,
n_("disable chroot builds") }, n_("disable chroot builds") },
{ "chroot-directory", GUIX_OPT_CHROOT_DIR, n_("DIR"), 0, { "chroot-directory", GUIX_OPT_CHROOT_DIR, n_("DIR"), 0,
@ -245,6 +251,12 @@ parse_opt (int key, char *arg, struct argp_state *state)
case 'M': case 'M':
settings.set ("build-max-jobs", arg); settings.set ("build-max-jobs", arg);
break; break;
case GUIX_OPT_TIMEOUT:
settings.set ("build-timeout", arg);
break;
case GUIX_OPT_MAX_SILENT_TIME:
settings.set ("build-max-silent-time", arg);
break;
case GUIX_OPT_SYSTEM: case GUIX_OPT_SYSTEM:
settings.thisSystem = arg; settings.thisSystem = arg;
break; break;

View File

@ -145,3 +145,39 @@ guile -c '
(exit (exit
(= 42 (pk (call-with-input-file (derivation->output-path drv) (= 42 (pk (call-with-input-file (derivation->output-path drv)
read)))))))' read)))))))'
kill "$daemon_pid"
# Make sure the daemon's default 'timeout' and 'max-silent-time' settings are
# honored.
client_code='
(use-modules (guix) (gnu packages) (guix tests) (srfi srfi-34))
(with-store store
(let* ((build (add-text-to-store store "build.sh"
"while true ; do : ; done"))
(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))))))
(exit (guard (c ((nix-protocol-error? c)
(->bool
(string-contains (pk (nix-protocol-error-message c))
"failed"))))
(build-derivations store (list drv))
#f))))'
for option in --max-silent-time=1 --timeout=1
do
guix-daemon --listen="$socket" --disable-chroot "$option" &
daemon_pid=$!
GUIX_DAEMON_SOCKET="$socket" guile -c "$client_code"
kill "$daemon_pid"
done