summaryrefslogtreecommitdiff
path: root/apt-pkg/edsp.cc
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-09-07 10:21:01 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2016-09-07 10:21:01 +0200
commit12b201da7c1d5e2beceae796151e4ebedc5bae97 (patch)
treeb69e53430efa30b34bd678f4cefb6e53fa373120 /apt-pkg/edsp.cc
parent99fdd8034b4a5cdb0100a33d0b3d5e26079c1695 (diff)
edsp: try 2 to read responses even if writing failed
Commit b60c8a89c281f2bb945d426d2215cbf8f5760738 improved the situation, but due to inconsistency mostly for planners, not for solvers. As the idea of hiding errors if we show another error is a bit scary (as the extern error might be a followup of our intern error, rather than the reason for our intern error as it is at the moment) we don't discard the errors, but if we got an extern error we show them directly removing them from the error list at the end of the run – that list will contain the extern error which hopefully gives us the best of both worlds. The problem itself is the same as before: The externals exiting before apt is done talking to them. Reported-By: Johannes 'josch' Schauer on IRC
Diffstat (limited to 'apt-pkg/edsp.cc')
-rw-r--r--apt-pkg/edsp.cc42
1 files changed, 27 insertions, 15 deletions
diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc
index f56625feb..b80b9a456 100644
--- a/apt-pkg/edsp.cc
+++ b/apt-pkg/edsp.cc
@@ -648,13 +648,19 @@ bool EDSP::ReadResponse(int const input, pkgDepCache &Cache, OpProgress *Progres
}
continue;
} else if (section.Exists("Error") == true) {
+ if (_error->PendingError()) {
+ if (Progress != nullptr)
+ Progress->Done();
+ Progress = nullptr;
+ _error->DumpErrors(std::cerr, GlobalError::DEBUG, false);
+ }
std::string msg = SubstVar(SubstVar(section.FindS("Message"), "\n .\n", "\n\n"), "\n ", "\n");
if (msg.empty() == true) {
msg = _("External solver failed without a proper error message");
_error->Error("%s", msg.c_str());
} else
_error->Error("External solver failed with: %s", msg.substr(0,msg.find('\n')).c_str());
- if (Progress != NULL)
+ if (Progress != nullptr)
Progress->Done();
std::cerr << "The solver encountered an error of type: " << section.FindS("Error") << std::endl;
std::cerr << "The following information might help you to understand what is wrong:" << std::endl;
@@ -1051,8 +1057,9 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
Okay &= EDSP::WriteRequest(Cache, output, flags, nullptr);
return Okay && EDSP::WriteScenario(Cache, output, nullptr);
}
+ _error->PushToStack();
int solver_in, solver_out;
- pid_t const solver_pid = EDSP::ExecuteSolver(solver, &solver_in, &solver_out, true);
+ pid_t const solver_pid = ExecuteSolver(solver, &solver_in, &solver_out, true);
if (solver_pid == 0)
return false;
@@ -1071,11 +1078,11 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
if (Okay && Progress != NULL)
Progress->OverallProgress(25, 100, 75, _("Execute external solver"));
- if (Okay && EDSP::ReadResponse(solver_out, Cache, Progress) == false)
- return false;
-
- bool const waited = ExecWait(solver_pid, solver);
- return Okay && waited;
+ bool const ret = EDSP::ReadResponse(solver_out, Cache, Progress);
+ _error->MergeWithStack();
+ if (ExecWait(solver_pid, solver))
+ return ret;
+ return false;
}
bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
bool const upgrade, bool const distUpgrade,
@@ -1108,7 +1115,7 @@ bool EIPP::OrderInstall(char const * const solver, pkgPackageManager * const PM,
Okay &= EIPP::WriteRequest(PM->Cache, output, flags, nullptr);
return Okay && EIPP::WriteScenario(PM->Cache, output, nullptr);
}
-
+ _error->PushToStack();
int solver_in, solver_out;
pid_t const solver_pid = ExecuteExternal("planner", solver, "Dir::Bin::Planners", &solver_in, &solver_out);
if (solver_pid == 0)
@@ -1139,12 +1146,11 @@ bool EIPP::OrderInstall(char const * const solver, pkgPackageManager * const PM,
PM->Remove(Pkg, true);
}
}
-
- if (EIPP::ReadResponse(solver_out, PM, Progress) == false)
- return false;
-
- bool const waited = ExecWait(solver_pid, solver);
- return Okay && waited;
+ bool const ret = EIPP::ReadResponse(solver_out, PM, Progress);
+ _error->MergeWithStack();
+ if (ExecWait(solver_pid, solver))
+ return ret;
+ return false;
}
/*}}}*/
bool EIPP::WriteRequest(pkgDepCache &Cache, FileFd &output, /*{{{*/
@@ -1341,13 +1347,19 @@ bool EIPP::ReadResponse(int const input, pkgPackageManager * const PM, OpProgres
}
continue;
} else if (section.Exists("Error") == true) {
+ if (_error->PendingError()) {
+ if (Progress != nullptr)
+ Progress->Done();
+ Progress = nullptr;
+ _error->DumpErrors(std::cerr, GlobalError::DEBUG, false);
+ }
std::string msg = SubstVar(SubstVar(section.FindS("Message"), "\n .\n", "\n\n"), "\n ", "\n");
if (msg.empty() == true) {
msg = _("External planner failed without a proper error message");
_error->Error("%s", msg.c_str());
} else
_error->Error("External planner failed with: %s", msg.substr(0,msg.find('\n')).c_str());
- if (Progress != NULL)
+ if (Progress != nullptr)
Progress->Done();
std::cerr << "The planner encountered an error of type: " << section.FindS("Error") << std::endl;
std::cerr << "The following information might help you to understand what is wrong:" << std::endl;