Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions src/libcmd/installables.cc
Original file line number Diff line number Diff line change
Expand Up @@ -583,16 +583,12 @@ static void throwBuildErrors(std::vector<KeyedBuildResult> & buildResults, const
auto failedResult = failed.begin();
if (failedResult != failed.end()) {
if (failed.size() == 1) {
failedResult->second->rethrow();
throw *failedResult->second;
} else {
StringSet failedPaths;
for (; failedResult != failed.end(); failedResult++) {
if (!failedResult->second->errorMsg.empty()) {
logError(
ErrorInfo{
.level = lvlError,
.msg = failedResult->second->errorMsg,
});
if (!failedResult->second->message().empty()) {
logError(failedResult->second->info());
}
failedPaths.insert(failedResult->first->path.to_string(store));
}
Expand Down
6 changes: 2 additions & 4 deletions src/libstore-c/nix_api_store.cc
Original file line number Diff line number Diff line change
Expand Up @@ -182,10 +182,8 @@ nix_err nix_store_realise(
assert(results.size() == 1);

// Check if any builds failed
for (auto & result : results) {
if (auto * failureP = result.tryGetFailure())
failureP->rethrow();
}
for (auto & result : results)
result.tryThrowBuildError();

if (callback) {
for (const auto & result : results) {
Expand Down
13 changes: 7 additions & 6 deletions src/libstore-tests/build-result.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <gtest/gtest.h>

#include "nix/store/build-result.hh"
#include "nix/util/tests/characterization.hh"
#include "nix/util/tests/json-characterization.hh"

namespace nix {
Expand Down Expand Up @@ -44,22 +45,22 @@ INSTANTIATE_TEST_SUITE_P(
std::pair{
"not-deterministic",
BuildResult{
.inner{BuildResult::Failure{
.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
.msg = HintFmt("no idea why"),
.isNonDeterministic = false, // Note: This field is separate from the status
}},
}}},
.timesBuilt = 1,
},
},
std::pair{
"output-rejected",
BuildResult{
.inner{BuildResult::Failure{
.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
.msg = HintFmt("no idea why"),
.isNonDeterministic = false,
}},
}}},
.timesBuilt = 3,
.startTime = 30,
.stopTime = 50,
Expand Down
36 changes: 18 additions & 18 deletions src/libstore-tests/serve-protocol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -147,14 +147,14 @@ VERSIONED_READ_CHARACTERIZATION_TEST(
VERSIONED_CHARACTERIZATION_TEST(ServeProtoTest, buildResult_2_2, "build-result-2.2", 2 << 8 | 2, ({
using namespace std::literals::chrono_literals;
std::tuple<BuildResult, BuildResult, BuildResult> t{
BuildResult{.inner{BuildResult::Failure{
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
BuildResult{.inner{BuildResult::Failure{
.msg = HintFmt("no idea why"),
}}}},
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
BuildResult{.inner{BuildResult::Success{
.status = BuildResult::Success::Built,
}}},
Expand All @@ -165,16 +165,16 @@ VERSIONED_CHARACTERIZATION_TEST(ServeProtoTest, buildResult_2_2, "build-result-2
VERSIONED_CHARACTERIZATION_TEST(ServeProtoTest, buildResult_2_3, "build-result-2.3", 2 << 8 | 3, ({
using namespace std::literals::chrono_literals;
std::tuple<BuildResult, BuildResult, BuildResult> t{
BuildResult{.inner{BuildResult::Failure{
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
BuildResult{
.inner{BuildResult::Failure{
.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
.msg = HintFmt("no idea why"),
.isNonDeterministic = true,
}},
}}},
.timesBuilt = 3,
.startTime = 30,
.stopTime = 50,
Expand All @@ -194,16 +194,16 @@ VERSIONED_CHARACTERIZATION_TEST(
ServeProtoTest, buildResult_2_6, "build-result-2.6", 2 << 8 | 6, ({
using namespace std::literals::chrono_literals;
std::tuple<BuildResult, BuildResult, BuildResult> t{
BuildResult{.inner{BuildResult::Failure{
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
BuildResult{
.inner{BuildResult::Failure{
.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
.msg = HintFmt("no idea why"),
.isNonDeterministic = true,
}},
}}},
.timesBuilt = 3,
.startTime = 30,
.stopTime = 50,
Expand Down
62 changes: 31 additions & 31 deletions src/libstore-tests/worker-protocol.cc
Original file line number Diff line number Diff line change
Expand Up @@ -200,14 +200,14 @@ VERSIONED_READ_CHARACTERIZATION_TEST(
VERSIONED_CHARACTERIZATION_TEST(WorkerProtoTest, buildResult_1_27, "build-result-1.27", 1 << 8 | 27, ({
using namespace std::literals::chrono_literals;
std::tuple<BuildResult, BuildResult, BuildResult> t{
BuildResult{.inner{BuildResult::Failure{
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
BuildResult{.inner{BuildResult::Failure{
.msg = HintFmt("no idea why"),
}}}},
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
BuildResult{.inner{BuildResult::Success{
.status = BuildResult::Success::Built,
}}},
Expand All @@ -219,14 +219,14 @@ VERSIONED_CHARACTERIZATION_TEST(
WorkerProtoTest, buildResult_1_28, "build-result-1.28", 1 << 8 | 28, ({
using namespace std::literals::chrono_literals;
std::tuple<BuildResult, BuildResult, BuildResult> t{
BuildResult{.inner{BuildResult::Failure{
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
BuildResult{.inner{BuildResult::Failure{
.msg = HintFmt("no idea why"),
}}}},
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
BuildResult{.inner{BuildResult::Success{
.status = BuildResult::Success::Built,
.builtOutputs =
Expand Down Expand Up @@ -265,16 +265,16 @@ VERSIONED_CHARACTERIZATION_TEST(
WorkerProtoTest, buildResult_1_29, "build-result-1.29", 1 << 8 | 29, ({
using namespace std::literals::chrono_literals;
std::tuple<BuildResult, BuildResult, BuildResult> t{
BuildResult{.inner{BuildResult::Failure{
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
BuildResult{
.inner{BuildResult::Failure{
.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
.msg = HintFmt("no idea why"),
.isNonDeterministic = true,
}},
}}},
.timesBuilt = 3,
.startTime = 30,
.stopTime = 50,
Expand Down Expand Up @@ -324,16 +324,16 @@ VERSIONED_CHARACTERIZATION_TEST(
WorkerProtoTest, buildResult_1_37, "build-result-1.37", 1 << 8 | 37, ({
using namespace std::literals::chrono_literals;
std::tuple<BuildResult, BuildResult, BuildResult> t{
BuildResult{.inner{BuildResult::Failure{
BuildResult{.inner{BuildResult::Failure{{
.status = BuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
BuildResult{
.inner{BuildResult::Failure{
.inner{BuildResult::Failure{{
.status = BuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
.msg = HintFmt("no idea why"),
.isNonDeterministic = true,
}},
}}},
.timesBuilt = 3,
.startTime = 30,
.stopTime = 50,
Expand Down Expand Up @@ -385,22 +385,22 @@ VERSIONED_CHARACTERIZATION_TEST(WorkerProtoTest, keyedBuildResult_1_29, "keyed-b
using namespace std::literals::chrono_literals;
std::tuple<KeyedBuildResult, KeyedBuildResult /*, KeyedBuildResult*/> t{
KeyedBuildResult{
{.inner{BuildResult::Failure{
BuildResult{.inner{KeyedBuildResult::Failure{{
.status = KeyedBuildResult::Failure::OutputRejected,
.errorMsg = "no idea why",
}}},
.msg = HintFmt("no idea why"),
}}}},
/* .path = */
DerivedPath::Opaque{
StorePath{"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-xxx"},
},
},
KeyedBuildResult{
{
.inner{BuildResult::Failure{
BuildResult{
.inner{KeyedBuildResult::Failure{{
.status = KeyedBuildResult::Failure::NotDeterministic,
.errorMsg = "no idea why",
.msg = HintFmt("no idea why"),
.isNonDeterministic = true,
}},
}}},
.timesBuilt = 3,
.startTime = 30,
.stopTime = 50,
Expand Down
28 changes: 17 additions & 11 deletions src/libstore/build-result.cc
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ std::strong_ordering BuildResult::operator<=>(const BuildResult &) const noexcep
bool BuildResult::Success::operator==(const BuildResult::Success &) const noexcept = default;
std::strong_ordering BuildResult::Success::operator<=>(const BuildResult::Success &) const noexcept = default;

bool BuildResult::Failure::operator==(const BuildResult::Failure &) const noexcept = default;
std::strong_ordering BuildResult::Failure::operator<=>(const BuildResult::Failure &) const noexcept = default;

static constexpr std::array<std::pair<BuildResult::Success::Status, std::string_view>, 4> successStatusStrings{{
#define ENUM_ENTRY(e) {BuildResult::Success::e, #e}
ENUM_ENTRY(Built),
Expand Down Expand Up @@ -75,9 +72,18 @@ static BuildResult::Failure::Status failureStatusFromString(std::string_view str
throw Error("unknown built result failure status '%s'", str);
}

[[noreturn]] void BuildResult::Failure::rethrow() const
bool BuildError::operator==(const BuildError & other) const noexcept
{
return status == other.status && isNonDeterministic == other.isNonDeterministic && message() == other.message();
}

std::strong_ordering BuildError::operator<=>(const BuildError & other) const noexcept
{
throw BuildError(status, "%s", errorMsg);
if (auto cmp = status <=> other.status; cmp != 0)
return cmp;
if (auto cmp = isNonDeterministic <=> other.isNonDeterministic; cmp != 0)
return cmp;
return message() <=> other.message();
}

} // namespace nix
Expand Down Expand Up @@ -113,7 +119,7 @@ void adl_serializer<BuildResult>::to_json(json & res, const BuildResult & br)
[&](const BuildResult::Failure & failure) {
res["success"] = false;
res["status"] = failureStatusToString(failure.status);
res["errorMsg"] = failure.errorMsg;
res["errorMsg"] = failure.message();
res["isNonDeterministic"] = failure.isNonDeterministic;
},
},
Expand Down Expand Up @@ -148,11 +154,11 @@ BuildResult adl_serializer<BuildResult>::from_json(const json & _json)
s.builtOutputs = valueAt(json, "builtOutputs");
br.inner = std::move(s);
} else {
BuildResult::Failure f;
f.status = failureStatusFromString(statusStr);
f.errorMsg = getString(valueAt(json, "errorMsg"));
f.isNonDeterministic = getBoolean(valueAt(json, "isNonDeterministic"));
br.inner = std::move(f);
br.inner = BuildResult::Failure{{
.status = failureStatusFromString(statusStr),
.msg = HintFmt(getString(valueAt(json, "errorMsg"))),
.isNonDeterministic = getBoolean(valueAt(json, "isNonDeterministic")),
}};
}

return br;
Expand Down
8 changes: 1 addition & 7 deletions src/libstore/build/derivation-building-goal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1210,13 +1210,7 @@ Goal::Done DerivationBuildingGoal::doneFailure(BuildError ex)

worker.updateProgress();

return Goal::doneFailure(
ecFailed,
BuildResult::Failure{
.status = ex.status,
.errorMsg = fmt("%s", Uncolored(ex.info().msg)),
},
std::move(ex));
return Goal::doneFailure(ecFailed, std::move(ex));
}

} // namespace nix
12 changes: 3 additions & 9 deletions src/libstore/build/derivation-goal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ Goal::Co DerivationGoal::haveDerivation(bool storeDerivation)
auto g = worker.makeDerivationBuildingGoal(drvPath, *drv, buildMode, storeDerivation);

/* We will finish with it ourselves, as if we were the derivational goal. */
g->preserveException = true;
g->preserveFailure = true;

{
Goals waitees;
Expand Down Expand Up @@ -312,7 +312,7 @@ Goal::Co DerivationGoal::haveDerivation(bool storeDerivation)
}
}

co_return amDone(g->exitCode, g->ex);
co_return amDone(g->exitCode);
}

Goal::Co DerivationGoal::repairClosure()
Expand Down Expand Up @@ -501,13 +501,7 @@ Goal::Done DerivationGoal::doneFailure(BuildError ex)

worker.updateProgress();

return Goal::doneFailure(
ecFailed,
BuildResult::Failure{
.status = ex.status,
.errorMsg = fmt("%s", Uncolored(ex.info().msg)),
},
std::move(ex));
return Goal::doneFailure(ecFailed, std::move(ex));
}

} // namespace nix
9 changes: 7 additions & 2 deletions src/libstore/build/derivation-resolution-goal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,12 @@ Goal::Co DerivationResolutionGoal::resolveDerivation()
nrFailed,
nrFailed == 1 ? "dependency" : "dependencies");
msg += showKnownOutputs(worker.store, *drv);
co_return amDone(ecFailed, {BuildError(BuildResult::Failure::DependencyFailed, msg)});
co_return doneFailure(
ecFailed,
BuildResult::Failure{{
.status = BuildResult::Failure::DependencyFailed,
.msg = HintFmt(msg),
}});
}

/* Gather information necessary for computing the closure and/or
Expand Down Expand Up @@ -185,7 +190,7 @@ Goal::Co DerivationResolutionGoal::resolveDerivation()
}
}

co_return amDone(ecSuccess, std::nullopt);
co_return amDone(ecSuccess);
}

} // namespace nix
Loading
Loading