From 2ca9f51ec8125c0124362300853365a1a6c76ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Sat, 3 Jun 2017 23:55:31 +0200 Subject: 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". --- doc/guix.texi | 25 +++++++++++++++++++++++-- nix/nix-daemon/guix-daemon.cc | 12 ++++++++++++ tests/guix-daemon.sh | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index aabb99039a..9dde022c54 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -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 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} 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 @@ -4940,12 +4958,15 @@ instead of offloading builds to remote machines. When the build or substitution process remains silent for more than @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} Likewise, when the build or substitution process lasts for more than @var{seconds}, terminate it and report a build failure. -By default there is no timeout. This behavior can be restored with -@code{--timeout=0}. +By default, the daemon's setting is honored (@pxref{Invoking +guix-daemon, @code{--timeout}}). @item --verbosity=@var{level} Use the given verbosity level. @var{level} must be an integer between 0 diff --git a/nix/nix-daemon/guix-daemon.cc b/nix/nix-daemon/guix-daemon.cc index aa47a290d2..0d9c33d1d2 100644 --- a/nix/nix-daemon/guix-daemon.cc +++ b/nix/nix-daemon/guix-daemon.cc @@ -81,6 +81,8 @@ builds derivations on behalf of its clients."); #define GUIX_OPT_GC_KEEP_OUTPUTS 15 #define GUIX_OPT_GC_KEEP_DERIVATIONS 16 #define GUIX_OPT_BUILD_ROUNDS 17 +#define GUIX_OPT_TIMEOUT 18 +#define GUIX_OPT_MAX_SILENT_TIME 19 static const struct argp_option options[] = { @@ -91,6 +93,10 @@ static const struct argp_option options[] = }, { "max-jobs", 'M', n_("N"), 0, 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, n_("disable chroot builds") }, { "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': settings.set ("build-max-jobs", arg); 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: settings.thisSystem = arg; break; diff --git a/tests/guix-daemon.sh b/tests/guix-daemon.sh index fde49e25a2..9186ffd585 100644 --- a/tests/guix-daemon.sh +++ b/tests/guix-daemon.sh @@ -145,3 +145,39 @@ guile -c ' (exit (= 42 (pk (call-with-input-file (derivation->output-path drv) 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 -- cgit v1.2.3