summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi25
-rw-r--r--nix/nix-daemon/guix-daemon.cc12
-rw-r--r--tests/guix-daemon.sh36
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