libstore: remove Worker::topGoals
since we now propagate goal exceptions properly we no longer need to
check topGoals for a reason to abort early. any early abort reasons,
whether by exception or a clean top goal failure, can now be handled
by inspecting the goal result in the main loop. this greatly reduces
goal-to-goal interactions that do not happen at the main loop level.
since the underscore-free name is now available for use as variables
we'll migrate to that where we currently use `_topGoals` for locals.
Change-Id: I5727c5ea7799647c0a69ab76975b1a03a6558aa6
This commit is contained in:
parent
f389a54079
commit
40f154c0ed
|
@ -46,7 +46,6 @@ Worker::~Worker()
|
||||||
goals that refer to this worker should be gone. (Otherwise we
|
goals that refer to this worker should be gone. (Otherwise we
|
||||||
are in trouble, since goals may call childTerminated() etc. in
|
are in trouble, since goals may call childTerminated() etc. in
|
||||||
their destructors). */
|
their destructors). */
|
||||||
topGoals.clear();
|
|
||||||
children.clear();
|
children.clear();
|
||||||
|
|
||||||
assert(expectedSubstitutions == 0);
|
assert(expectedSubstitutions == 0);
|
||||||
|
@ -216,14 +215,6 @@ void Worker::removeGoal(GoalPtr goal)
|
||||||
nix::removeGoal(subGoal, drvOutputSubstitutionGoals);
|
nix::removeGoal(subGoal, drvOutputSubstitutionGoals);
|
||||||
else
|
else
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
||||||
if (topGoals.find(goal) != topGoals.end()) {
|
|
||||||
topGoals.erase(goal);
|
|
||||||
/* If a top-level goal failed, then kill all other goals
|
|
||||||
(unless keepGoing was set). */
|
|
||||||
if (goal->exitCode == Goal::ecFailed && !settings.keepGoing)
|
|
||||||
topGoals.clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -268,7 +259,7 @@ try {
|
||||||
|
|
||||||
std::vector<GoalPtr> Worker::run(std::function<Targets (GoalFactory &)> req)
|
std::vector<GoalPtr> Worker::run(std::function<Targets (GoalFactory &)> req)
|
||||||
{
|
{
|
||||||
auto _topGoals = req(goalFactory());
|
auto topGoals = req(goalFactory());
|
||||||
|
|
||||||
assert(!running);
|
assert(!running);
|
||||||
running = true;
|
running = true;
|
||||||
|
@ -276,9 +267,7 @@ std::vector<GoalPtr> Worker::run(std::function<Targets (GoalFactory &)> req)
|
||||||
|
|
||||||
std::vector<GoalPtr> results;
|
std::vector<GoalPtr> results;
|
||||||
|
|
||||||
topGoals.clear();
|
for (auto & [goal, _promise] : topGoals) {
|
||||||
for (auto & [goal, _promise] : _topGoals) {
|
|
||||||
topGoals.insert(goal);
|
|
||||||
results.push_back(goal);
|
results.push_back(goal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +276,7 @@ std::vector<GoalPtr> Worker::run(std::function<Targets (GoalFactory &)> req)
|
||||||
return result::failure(std::make_exception_ptr(makeInterrupted()));
|
return result::failure(std::make_exception_ptr(makeInterrupted()));
|
||||||
});
|
});
|
||||||
|
|
||||||
auto promise = runImpl(std::move(_topGoals))
|
auto promise = runImpl(std::move(topGoals))
|
||||||
.exclusiveJoin(updateStatistics())
|
.exclusiveJoin(updateStatistics())
|
||||||
.exclusiveJoin(std::move(onInterrupt.promise));
|
.exclusiveJoin(std::move(onInterrupt.promise));
|
||||||
|
|
||||||
|
@ -302,21 +291,26 @@ std::vector<GoalPtr> Worker::run(std::function<Targets (GoalFactory &)> req)
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
kj::Promise<Result<void>> Worker::runImpl(Targets _topGoals)
|
kj::Promise<Result<void>> Worker::runImpl(Targets topGoals)
|
||||||
try {
|
try {
|
||||||
debug("entered goal loop");
|
debug("entered goal loop");
|
||||||
|
|
||||||
kj::Vector<Targets::value_type> promises(_topGoals.size());
|
kj::Vector<Targets::value_type> promises(topGoals.size());
|
||||||
for (auto & gp : _topGoals) {
|
for (auto & gp : topGoals) {
|
||||||
promises.add(std::move(gp));
|
promises.add(std::move(gp));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto collect = AsyncCollect(promises.releaseAsArray());
|
auto collect = AsyncCollect(promises.releaseAsArray());
|
||||||
while (auto done = co_await collect.next()) {
|
while (auto done = co_await collect.next()) {
|
||||||
// propagate goal exceptions outward
|
// propagate goal exceptions outward
|
||||||
BOOST_OUTCOME_CO_TRYV(done->second);
|
BOOST_OUTCOME_CO_TRY(auto result, done->second);
|
||||||
|
|
||||||
if (topGoals.empty()) break;
|
/* If a top-level goal failed, then kill all other goals
|
||||||
|
(unless keepGoing was set). */
|
||||||
|
if (result.exitCode == Goal::ecFailed && !settings.keepGoing) {
|
||||||
|
children.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If --keep-going is not set, it's possible that the main goal
|
/* If --keep-going is not set, it's possible that the main goal
|
||||||
|
|
|
@ -91,11 +91,6 @@ private:
|
||||||
|
|
||||||
bool running = false;
|
bool running = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* The top-level goals of the worker.
|
|
||||||
*/
|
|
||||||
Goals topGoals;
|
|
||||||
|
|
||||||
template<typename G>
|
template<typename G>
|
||||||
struct CachedGoal
|
struct CachedGoal
|
||||||
{
|
{
|
||||||
|
@ -172,7 +167,7 @@ private:
|
||||||
statisticsUpdateInhibitor = {};
|
statisticsUpdateInhibitor = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
kj::Promise<Result<void>> runImpl(Targets _topGoals);
|
kj::Promise<Result<void>> runImpl(Targets topGoals);
|
||||||
kj::Promise<Result<void>> boopGC(LocalStore & localStore);
|
kj::Promise<Result<void>> boopGC(LocalStore & localStore);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in a new issue