From 906334686c61aac648ac1da76278514cae49d551 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sat, 13 Dec 2025 23:18:01 -0500 Subject: [PATCH] Make worker timeouts a bit more strongly typed This tidies things up in general, but also prepares the way for the next commit in particular. --- src/libstore/build/derivation-building-goal.cc | 4 ++-- src/libstore/build/goal.cc | 6 ++++++ src/libstore/build/worker.cc | 5 ++--- .../include/nix/store/build/derivation-building-goal.hh | 2 +- src/libstore/include/nix/store/build/derivation-goal.hh | 2 +- .../nix/store/build/derivation-resolution-goal.hh | 2 +- .../nix/store/build/derivation-trampoline-goal.hh | 2 +- .../nix/store/build/drv-output-substitution-goal.hh | 2 +- src/libstore/include/nix/store/build/goal.hh | 9 ++++++++- .../include/nix/store/build/substitution-goal.hh | 2 +- 10 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/libstore/build/derivation-building-goal.cc b/src/libstore/build/derivation-building-goal.cc index 8221e12c6..f579ae1e7 100644 --- a/src/libstore/build/derivation-building-goal.cc +++ b/src/libstore/build/derivation-building-goal.cc @@ -71,12 +71,12 @@ void DerivationBuildingGoal::killChild() #endif } -void DerivationBuildingGoal::timedOut(Error && ex) +void DerivationBuildingGoal::timedOut(TimedOut && ex) { killChild(); // We're not inside a coroutine, hence we can't use co_return here. // Thus we ignore the return value. - [[maybe_unused]] Done _ = doneFailure({BuildResult::Failure::TimedOut, std::move(ex)}); + [[maybe_unused]] Done _ = doneFailure(std::move(ex)); } std::string showKnownOutputs(const StoreDirConfig & store, const Derivation & drv) diff --git a/src/libstore/build/goal.cc b/src/libstore/build/goal.cc index 6266329e7..fd613265a 100644 --- a/src/libstore/build/goal.cc +++ b/src/libstore/build/goal.cc @@ -4,6 +4,12 @@ namespace nix { +TimedOut::TimedOut(time_t maxDuration) + : BuildError(BuildResult::Failure::TimedOut, "timed out after %1% seconds", maxDuration) + , maxDuration(maxDuration) +{ +} + using Co = nix::Goal::Co; using promise_type = nix::Goal::promise_type; using handle_type = nix::Goal::handle_type; diff --git a/src/libstore/build/worker.cc b/src/libstore/build/worker.cc index 3663a2c91..754f4b1cc 100644 --- a/src/libstore/build/worker.cc +++ b/src/libstore/build/worker.cc @@ -479,14 +479,13 @@ void Worker::waitForInput() if (goal->exitCode == Goal::ecBusy && 0 != settings.maxSilentTime && j->respectTimeouts && after - j->lastOutput >= std::chrono::seconds(settings.maxSilentTime)) { - goal->timedOut( - Error("%1% timed out after %2% seconds of silence", goal->getName(), settings.maxSilentTime)); + goal->timedOut(TimedOut(settings.maxSilentTime)); } else if ( goal->exitCode == Goal::ecBusy && 0 != settings.buildTimeout && j->respectTimeouts && after - j->timeStarted >= std::chrono::seconds(settings.buildTimeout)) { - goal->timedOut(Error("%1% timed out after %2% seconds", goal->getName(), settings.buildTimeout)); + goal->timedOut(TimedOut(settings.buildTimeout)); } } diff --git a/src/libstore/include/nix/store/build/derivation-building-goal.hh b/src/libstore/include/nix/store/build/derivation-building-goal.hh index be95c796b..dc27a88b5 100644 --- a/src/libstore/include/nix/store/build/derivation-building-goal.hh +++ b/src/libstore/include/nix/store/build/derivation-building-goal.hh @@ -100,7 +100,7 @@ private: std::map builderActivities; - void timedOut(Error && ex) override; + void timedOut(TimedOut && ex) override; std::string key() override; diff --git a/src/libstore/include/nix/store/build/derivation-goal.hh b/src/libstore/include/nix/store/build/derivation-goal.hh index 0fe610987..16027d1d0 100644 --- a/src/libstore/include/nix/store/build/derivation-goal.hh +++ b/src/libstore/include/nix/store/build/derivation-goal.hh @@ -52,7 +52,7 @@ struct DerivationGoal : public Goal bool storeDerivation); ~DerivationGoal() = default; - void timedOut(Error && ex) override + void timedOut(TimedOut && ex) override { unreachable(); }; diff --git a/src/libstore/include/nix/store/build/derivation-resolution-goal.hh b/src/libstore/include/nix/store/build/derivation-resolution-goal.hh index fb4c2a346..8cdf3e094 100644 --- a/src/libstore/include/nix/store/build/derivation-resolution-goal.hh +++ b/src/libstore/include/nix/store/build/derivation-resolution-goal.hh @@ -43,7 +43,7 @@ struct DerivationResolutionGoal : public Goal */ std::unique_ptr> resolvedDrv; - void timedOut(Error && ex) override {} + void timedOut(TimedOut && ex) override {} private: diff --git a/src/libstore/include/nix/store/build/derivation-trampoline-goal.hh b/src/libstore/include/nix/store/build/derivation-trampoline-goal.hh index bfed67f63..0053ef102 100644 --- a/src/libstore/include/nix/store/build/derivation-trampoline-goal.hh +++ b/src/libstore/include/nix/store/build/derivation-trampoline-goal.hh @@ -109,7 +109,7 @@ struct DerivationTrampolineGoal : public Goal virtual ~DerivationTrampolineGoal(); - void timedOut(Error && ex) override {} + void timedOut(TimedOut && ex) override {} std::string key() override; diff --git a/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh b/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh index 6310e0d2c..08d5f0268 100644 --- a/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh +++ b/src/libstore/include/nix/store/build/drv-output-substitution-goal.hh @@ -33,7 +33,7 @@ public: Co init(); - void timedOut(Error && ex) override + void timedOut(TimedOut && ex) override { unreachable(); }; diff --git a/src/libstore/include/nix/store/build/goal.hh b/src/libstore/include/nix/store/build/goal.hh index 4d57afc0f..41f8ecaee 100644 --- a/src/libstore/include/nix/store/build/goal.hh +++ b/src/libstore/include/nix/store/build/goal.hh @@ -8,6 +8,13 @@ namespace nix { +struct TimedOut : BuildError +{ + time_t maxDuration; + + TimedOut(time_t maxDuration); +}; + /** * Forward definition. */ @@ -454,7 +461,7 @@ public: * get rid of any running child processes that are being monitored * by the worker (important!), etc. */ - virtual void timedOut(Error && ex) = 0; + virtual void timedOut(TimedOut && ex) = 0; /** * Used for comparisons. The order matters a bit for scheduling. We diff --git a/src/libstore/include/nix/store/build/substitution-goal.hh b/src/libstore/include/nix/store/build/substitution-goal.hh index 5f33b9aa5..ae3ba7b4d 100644 --- a/src/libstore/include/nix/store/build/substitution-goal.hh +++ b/src/libstore/include/nix/store/build/substitution-goal.hh @@ -53,7 +53,7 @@ public: std::optional ca = std::nullopt); ~PathSubstitutionGoal(); - void timedOut(Error && ex) override + void timedOut(TimedOut && ex) override { unreachable(); };