diff options
author | eldritch horrors <pennae@lix.systems> | 2024-09-28 23:18:35 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-09-29 13:17:15 +0000 |
commit | 1a52e4f755c3fcc50e58f7a0b04269a3839b7eea (patch) | |
tree | a2fddb201b17464a56cedabda8ea2651143879e8 | |
parent | 3f7519526f7e2cd3ede01c3910fbfe2ddf0f051f (diff) |
libstore: fix build tests
the new event loop could very occasionally notice that a dependency of
some goal has failed, process the failure, cause the depending goal to
fail accordingly, and in the doing of the latter two steps let further
dependencies that previously have not been reported as failed do their
reporting anyway. in such cases a goal could fail with "1 dependencies
failed", but more than one dependency failure message was shown. we'll
now report the correct number of failed dependency goals in all cases.
Change-Id: I5aa95dcb2db4de4fd5fee8acbf5db833531d81a8
-rw-r--r-- | src/libstore/build/goal.cc | 18 | ||||
-rw-r--r-- | tests/functional/build.sh | 6 |
2 files changed, 14 insertions, 10 deletions
diff --git a/src/libstore/build/goal.cc b/src/libstore/build/goal.cc index 8a2f4ab35..5f0ed485c 100644 --- a/src/libstore/build/goal.cc +++ b/src/libstore/build/goal.cc @@ -33,18 +33,22 @@ kj::Promise<Result<Goal::WorkResult>> Goal::waitForGoals(kj::Array<std::pair<GoalPtr, kj::Promise<void>>> dependencies) noexcept try { auto left = dependencies.size(); + for (auto & [dep, p] : dependencies) { + p = p.then([this, dep, &left] { + left--; + trace(fmt("waitee '%s' done; %d left", dep->name, left)); + + if (dep->exitCode != Goal::ecSuccess) ++nrFailed; + if (dep->exitCode == Goal::ecNoSubstituters) ++nrNoSubstituters; + if (dep->exitCode == Goal::ecIncompleteClosure) ++nrIncompleteClosure; + }).eagerlyEvaluate(nullptr); + } + auto collectDeps = asyncCollect(std::move(dependencies)); while (auto item = co_await collectDeps.next()) { - left--; auto & dep = *item; - trace(fmt("waitee '%s' done; %d left", dep->name, left)); - - if (dep->exitCode != Goal::ecSuccess) ++nrFailed; - if (dep->exitCode == Goal::ecNoSubstituters) ++nrNoSubstituters; - if (dep->exitCode == Goal::ecIncompleteClosure) ++nrIncompleteClosure; - waiteeDone(dep); if (dep->exitCode == ecFailed && !settings.keepGoing) { diff --git a/tests/functional/build.sh b/tests/functional/build.sh index 356985a64..f80711b31 100644 --- a/tests/functional/build.sh +++ b/tests/functional/build.sh @@ -167,9 +167,9 @@ test "$(<<<"$out" grep -E '^error:' | wc -l)" = 4 out="$(nix build -f fod-failing.nix -L x4 2>&1)" && status=0 || status=$? test "$status" = 1 -test "$(<<<"$out" grep -E '^error:' | wc -l)" = 2 -<<<"$out" grepQuiet -E "error: 1 dependencies of derivation '.*-x4\\.drv' failed to build" -<<<"$out" grepQuiet -E "hash mismatch in fixed-output derivation '.*-x2\\.drv'" +test "$(<<<"$out" grep -E '^error:' | wc -l)" -ge 2 +<<<"$out" grepQuiet -E "error: [12] dependencies of derivation '.*-x4\\.drv' failed to build" +<<<"$out" grepQuiet -E "hash mismatch in fixed-output derivation '.*-x[23]\\.drv'" out="$(nix build -f fod-failing.nix -L x4 --keep-going 2>&1)" && status=0 || status=$? test "$status" = 1 |