From e55ec75619b775bf0f5dd60e3da8de9bc8235f68 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Sun, 25 Aug 2024 13:41:56 +0200 Subject: [PATCH] libstore: print dependency errors from DerivationGoal this is not ideal, but it's better than having this stuck in the worker loop itself. setting ex on all failing goals is not problematic because only toplevel goals can ever be observable, all the others are ignored. notably only derivation goals ever set `ex`, substitution goals do not. Change-Id: I02e2164487b2955df053fef3c8e774d557aa638a --- src/libstore/build/derivation-goal.cc | 4 ++++ src/libstore/build/worker.cc | 8 +------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/libstore/build/derivation-goal.cc b/src/libstore/build/derivation-goal.cc index 3dca7a3c0..a75a674d1 100644 --- a/src/libstore/build/derivation-goal.cc +++ b/src/libstore/build/derivation-goal.cc @@ -1544,6 +1544,10 @@ Goal::Finished DerivationGoal::done( fs << worker.store.printStorePath(drvPath) << "\t" << buildResult.toString() << std::endl; } + if (ex && isDependency) { + logError(ex->info()); + } + return Finished{ .result = buildResult.success() ? ecSuccess : ecFailed, .ex = ex ? std::make_shared(std::move(*ex)) : nullptr, diff --git a/src/libstore/build/worker.cc b/src/libstore/build/worker.cc index 5d0cc920a..7336ad50f 100644 --- a/src/libstore/build/worker.cc +++ b/src/libstore/build/worker.cc @@ -157,19 +157,13 @@ void Worker::goalFinished(GoalPtr goal, Goal::Finished & f) goal->trace("done"); assert(!goal->exitCode.has_value()); goal->exitCode = f.result; + goal->ex = f.ex; permanentFailure |= f.permanentFailure; timedOut |= f.timedOut; hashMismatch |= f.hashMismatch; checkMismatch |= f.checkMismatch; - if (f.ex) { - if (!goal->waiters.empty()) - logError(f.ex->info()); - else - goal->ex = f.ex; - } - for (auto & i : goal->waiters) { if (GoalPtr waiting = i.lock()) { assert(waiting->waitees.count(goal));