Merge pull request #825 from samueldr/fix/unhelpful-errors-in-aggregates

Fix unhelpful error messages in aggregate jobs.
This commit is contained in:
Graham Christensen 2021-10-23 20:34:50 -04:00 committed by GitHub
commit 3516950d3c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -438,12 +438,16 @@ int main(int argc, char * * argv)
for (auto i = state->jobs.begin(); i != state->jobs.end(); ++i) { for (auto i = state->jobs.begin(); i != state->jobs.end(); ++i) {
auto jobName = i.key(); auto jobName = i.key();
auto & job = i.value(); auto & job = i.value();
// For the error message
std::string lastTriedJobName = i.key();
auto named = job.find("namedConstituents"); auto named = job.find("namedConstituents");
if (named == job.end()) continue; if (named == job.end()) continue;
try {
if (myArgs.dryRun) { if (myArgs.dryRun) {
for (std::string jobName2 : *named) { for (std::string jobName2 : *named) {
lastTriedJobName = jobName2;
auto job2 = state->jobs.find(jobName2); auto job2 = state->jobs.find(jobName2);
if (job2 == state->jobs.end()) if (job2 == state->jobs.end())
throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2); throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2);
@ -455,14 +459,23 @@ int main(int argc, char * * argv)
auto drv = store->readDerivation(drvPath); auto drv = store->readDerivation(drvPath);
for (std::string jobName2 : *named) { for (std::string jobName2 : *named) {
lastTriedJobName = jobName2;
auto job2 = state->jobs.find(jobName2); auto job2 = state->jobs.find(jobName2);
if (job2 == state->jobs.end()) if (job2 == state->jobs.end())
throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2); throw Error("aggregate job '%s' references non-existent job '%s'", jobName, jobName2);
if ((*job2).find("error") != (*job2).end()) {
if (job.find("error") == job.end()) {
job["error"] = fmt("Errors aggregating aggregate job '%1%'.\n", jobName);
}
job["error"] = fmt("While handling '%1%': %2%\n", jobName2, (std::string) (*job2)["error"]);
} else {
auto drvPath2 = store->parseStorePath((std::string) (*job2)["drvPath"]); auto drvPath2 = store->parseStorePath((std::string) (*job2)["drvPath"]);
auto drv2 = store->readDerivation(drvPath2); auto drv2 = store->readDerivation(drvPath2);
job["constituents"].push_back(store->printStorePath(drvPath2)); job["constituents"].push_back(store->printStorePath(drvPath2));
drv.inputDrvs[drvPath2] = {drv2.outputs.begin()->first}; drv.inputDrvs[drvPath2] = {drv2.outputs.begin()->first};
} }
}
std::string drvName(drvPath.name()); std::string drvName(drvPath.name());
assert(hasSuffix(drvName, drvExtension)); assert(hasSuffix(drvName, drvExtension));
@ -478,6 +491,13 @@ int main(int argc, char * * argv)
job["drvPath"] = newDrvPath; job["drvPath"] = newDrvPath;
job["outputs"]["out"] = store->printStorePath(outPath); job["outputs"]["out"] = store->printStorePath(outPath);
} }
} catch (std::exception & e) {
// Print more information to help debugging.
printError("Unexpected error in hydra-eval-jobs when handling job '%s', when producing aggregate job '%s':", lastTriedJobName, jobName);
// And throw the original exception!
throw;
}
job.erase("namedConstituents"); job.erase("namedConstituents");
} }