diff options
author | eldritch horrors <pennae@lix.systems> | 2024-08-25 13:41:56 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-08-30 11:13:07 +0000 |
commit | e55ec75619b775bf0f5dd60e3da8de9bc8235f68 (patch) | |
tree | 15492866df30bfa2b5cdc77a0302b7565e16ded2 /src/libstore/build | |
parent | 869666cb651f97cdce3a6aabf62073bfe1130cbb (diff) |
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
Diffstat (limited to 'src/libstore/build')
-rw-r--r-- | src/libstore/build/derivation-goal.cc | 4 | ||||
-rw-r--r-- | 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<Error>(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)); |