From 1a52e4f755c3fcc50e58f7a0b04269a3839b7eea Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Sat, 28 Sep 2024 23:18:35 +0200 Subject: 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 --- src/libstore/build/goal.cc | 18 +++++++++++------- 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> Goal::waitForGoals(kj::Array>> 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 -- cgit v1.2.3