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
This commit is contained in:
eldritch horrors 2024-08-25 13:41:56 +02:00
parent 869666cb65
commit e55ec75619
2 changed files with 5 additions and 7 deletions

View file

@ -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<Error>(std::move(*ex)) : nullptr,

View file

@ -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));