diff --git a/lix/libstore/build/derivation-goal.cc b/lix/libstore/build/derivation-goal.cc index d3f0eeb10..b3873e32d 100644 --- a/lix/libstore/build/derivation-goal.cc +++ b/lix/libstore/build/derivation-goal.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -688,13 +689,10 @@ retry: actLock.reset(); buildResult.startTime = time(0); // inexact started(); - auto r = co_await a.promise; - if (r.has_value()) { - co_return co_await buildDone(); - } else if (r.has_error()) { - co_return r.assume_error(); + if (auto error = TRY_AWAIT(a.promise)) { + co_return *error; } else { - co_return r.assume_exception(); + co_return co_await buildDone(); } } @@ -1193,7 +1191,7 @@ Goal::WorkResult DerivationGoal::tooMuchLogs() getName(), settings.maxLogSize)); } -kj::Promise> +kj::Promise>> DerivationGoal::handleBuilderOutput(AsyncInputStream & in) noexcept try { auto buf = kj::heapArray(4096); @@ -1213,7 +1211,7 @@ try { lastChildActivity = AIO().provider.getTimer().now(); if (data.empty()) { - co_return result::success(); + co_return std::nullopt; } logSize += data.size(); @@ -1238,8 +1236,8 @@ try { co_return result::current_exception(); } -kj::Promise> DerivationGoal::handleHookOutput(AsyncInputStream & in -) noexcept +kj::Promise>> +DerivationGoal::handleHookOutput(AsyncInputStream & in) noexcept try { auto buf = kj::heapArray(4096); while (true) { @@ -1247,7 +1245,7 @@ try { lastChildActivity = AIO().provider.getTimer().now(); if (data.empty()) { - co_return result::success(); + co_return std::nullopt; } for (auto c : data) @@ -1293,7 +1291,7 @@ try { co_return result::current_exception(); } -kj::Promise> DerivationGoal::handleChildOutput() noexcept +kj::Promise>> DerivationGoal::handleChildOutput() noexcept try { kj::Own builderIn, hookIn; if (builderOutFD) { @@ -1308,9 +1306,10 @@ try { if (respectsTimeouts() && settings.buildTimeout != 0) { handlers = handlers.exclusiveJoin( - AIO().provider.getTimer() + AIO() + .provider.getTimer() .afterDelay(settings.buildTimeout.get() * kj::SECONDS) - .then([this]() -> Outcome { + .then([this]() -> Result> { return timedOut( Error("%1% timed out after %2% seconds", name, settings.buildTimeout) ); @@ -1318,7 +1317,7 @@ try { ); } - return handlers.then([this](auto r) -> Outcome { + return handlers.then([this](auto r) { if (!currentLogLine.empty()) flushLine(); return r; }); @@ -1326,7 +1325,7 @@ try { return {result::current_exception()}; } -kj::Promise> DerivationGoal::monitorForSilence() noexcept +kj::Promise>> DerivationGoal::monitorForSilence() noexcept { while (true) { const auto stash = lastChildActivity; @@ -1340,7 +1339,7 @@ kj::Promise> DerivationGoal::monitorForSilence() } } -kj::Promise> +kj::Promise>> DerivationGoal::handleChildStreams(AsyncInputStream * builderIn, AsyncInputStream * hookIn) noexcept { assert(builderIn || hookIn); @@ -1348,7 +1347,7 @@ DerivationGoal::handleChildStreams(AsyncInputStream * builderIn, AsyncInputStrea lastChildActivity = AIO().provider.getTimer().now(); auto handlers = kj::joinPromisesFailFast([&] { - kj::Vector>> parts{2}; + kj::Vector>>> parts{2}; if (builderIn) { parts.add(handleBuilderOutput(*builderIn)); @@ -1367,9 +1366,11 @@ DerivationGoal::handleChildStreams(AsyncInputStream * builderIn, AsyncInputStrea } for (auto r : co_await handlers) { - BOOST_OUTCOME_CO_TRYV(r); + if (r) { + co_return r; + } } - co_return result::success(); + co_return std::nullopt; } void DerivationGoal::flushLine() diff --git a/lix/libstore/build/derivation-goal.hh b/lix/libstore/build/derivation-goal.hh index 881ece928..cc0cdeaf4 100644 --- a/lix/libstore/build/derivation-goal.hh +++ b/lix/libstore/build/derivation-goal.hh @@ -9,6 +9,7 @@ #include "lix/libstore/pathlocks.hh" #include "lix/libstore/build/goal.hh" #include +#include namespace nix { @@ -18,7 +19,7 @@ struct HookInstance; struct HookReplyBase { struct [[nodiscard]] Accept { - kj::Promise> promise; + kj::Promise>> promise; }; struct [[nodiscard]] Decline {}; struct [[nodiscard]] Postpone {}; @@ -313,12 +314,13 @@ struct DerivationGoal : public Goal protected: kj::TimePoint lastChildActivity = kj::minValue; - kj::Promise> handleChildOutput() noexcept; - kj::Promise> + kj::Promise>> handleChildOutput() noexcept; + kj::Promise>> handleChildStreams(AsyncInputStream * builderIn, AsyncInputStream * hookIn) noexcept; - kj::Promise> handleBuilderOutput(AsyncInputStream & in) noexcept; - kj::Promise> handleHookOutput(AsyncInputStream & in) noexcept; - kj::Promise> monitorForSilence() noexcept; + kj::Promise>> handleBuilderOutput(AsyncInputStream & in + ) noexcept; + kj::Promise>> handleHookOutput(AsyncInputStream & in) noexcept; + kj::Promise>> monitorForSilence() noexcept; WorkResult tooMuchLogs(); void flushLine(); diff --git a/lix/libstore/build/local-derivation-goal.cc b/lix/libstore/build/local-derivation-goal.cc index 9be1f5cbd..4de0a41c0 100644 --- a/lix/libstore/build/local-derivation-goal.cc +++ b/lix/libstore/build/local-derivation-goal.cc @@ -261,13 +261,8 @@ retry: TRY_AWAIT(startBuilder()); started(); - auto r = co_await handleChildOutput(); - if (r.has_value()) { - // all good so far - } else if (r.has_error()) { - co_return r.assume_error(); - } else { - co_return r.assume_exception(); + if (auto error = TRY_AWAIT(handleChildOutput())) { + co_return std::move(*error); } } catch (BuildError & e) {