libstore: turn Worker::run into a promise
a first little step into pushing the event loops up, up and away.
eventually we will want them to be instantiated only at the roots
of every thread (since kj binds loops to threads), but not today.
Change-Id: Ic97f1debba382a5a3f46daeaf2d6d434ee42569f
This commit is contained in:
parent
faee771b30
commit
5f1344dd8a
|
@ -15,7 +15,7 @@ void Store::buildPaths(const std::vector<DerivedPath> & reqs, BuildMode buildMod
|
||||||
for (auto & br : reqs)
|
for (auto & br : reqs)
|
||||||
goals.emplace_back(gf.makeGoal(br, buildMode));
|
goals.emplace_back(gf.makeGoal(br, buildMode));
|
||||||
return goals;
|
return goals;
|
||||||
});
|
}).wait(aio.waitScope).value();
|
||||||
|
|
||||||
StringSet failed;
|
StringSet failed;
|
||||||
std::shared_ptr<Error> ex;
|
std::shared_ptr<Error> ex;
|
||||||
|
@ -54,7 +54,7 @@ std::vector<KeyedBuildResult> Store::buildPathsWithResults(
|
||||||
goals.emplace_back(gf.makeGoal(req, buildMode));
|
goals.emplace_back(gf.makeGoal(req, buildMode));
|
||||||
}
|
}
|
||||||
return goals;
|
return goals;
|
||||||
}).goals;
|
}).wait(aio.waitScope).value().goals;
|
||||||
|
|
||||||
std::vector<KeyedBuildResult> results;
|
std::vector<KeyedBuildResult> results;
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ BuildResult Store::buildDerivation(const StorePath & drvPath, const BasicDerivat
|
||||||
Worker::Targets goals;
|
Worker::Targets goals;
|
||||||
goals.emplace_back(gf.makeBasicDerivationGoal(drvPath, drv, OutputsSpec::All{}, buildMode));
|
goals.emplace_back(gf.makeBasicDerivationGoal(drvPath, drv, OutputsSpec::All{}, buildMode));
|
||||||
return goals;
|
return goals;
|
||||||
});
|
}).wait(aio.waitScope).value();
|
||||||
auto & result = results.goals.begin()->second;
|
auto & result = results.goals.begin()->second;
|
||||||
return result.result.restrictTo(DerivedPath::Built {
|
return result.result.restrictTo(DerivedPath::Built {
|
||||||
.drvPath = makeConstantStorePathRef(drvPath),
|
.drvPath = makeConstantStorePathRef(drvPath),
|
||||||
|
@ -100,7 +100,7 @@ void Store::ensurePath(const StorePath & path)
|
||||||
Worker::Targets goals;
|
Worker::Targets goals;
|
||||||
goals.emplace_back(gf.makePathSubstitutionGoal(path));
|
goals.emplace_back(gf.makePathSubstitutionGoal(path));
|
||||||
return goals;
|
return goals;
|
||||||
});
|
}).wait(aio.waitScope).value();
|
||||||
auto & result = results.goals.begin()->second;
|
auto & result = results.goals.begin()->second;
|
||||||
|
|
||||||
if (result.exitCode != Goal::ecSuccess) {
|
if (result.exitCode != Goal::ecSuccess) {
|
||||||
|
@ -121,7 +121,7 @@ void Store::repairPath(const StorePath & path)
|
||||||
Worker::Targets goals;
|
Worker::Targets goals;
|
||||||
goals.emplace_back(gf.makePathSubstitutionGoal(path, Repair));
|
goals.emplace_back(gf.makePathSubstitutionGoal(path, Repair));
|
||||||
return goals;
|
return goals;
|
||||||
});
|
}).wait(aio.waitScope).value();
|
||||||
auto & result = results.goals.begin()->second;
|
auto & result = results.goals.begin()->second;
|
||||||
|
|
||||||
if (result.exitCode != Goal::ecSuccess) {
|
if (result.exitCode != Goal::ecSuccess) {
|
||||||
|
@ -140,7 +140,7 @@ void Store::repairPath(const StorePath & path)
|
||||||
bmRepair
|
bmRepair
|
||||||
));
|
));
|
||||||
return goals;
|
return goals;
|
||||||
});
|
}).wait(aio.waitScope).value();
|
||||||
} else
|
} else
|
||||||
throw Error(results.failingExitStatus, "cannot repair path '%s'", printStorePath(path));
|
throw Error(results.failingExitStatus, "cannot repair path '%s'", printStorePath(path));
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,8 +229,8 @@ try {
|
||||||
co_return result::failure(std::current_exception());
|
co_return result::failure(std::current_exception());
|
||||||
}
|
}
|
||||||
|
|
||||||
Worker::Results Worker::run(std::function<Targets (GoalFactory &)> req)
|
kj::Promise<Result<Worker::Results>> Worker::run(std::function<Targets (GoalFactory &)> req)
|
||||||
{
|
try {
|
||||||
auto topGoals = req(goalFactory());
|
auto topGoals = req(goalFactory());
|
||||||
|
|
||||||
assert(!running);
|
assert(!running);
|
||||||
|
@ -252,7 +252,9 @@ Worker::Results Worker::run(std::function<Targets (GoalFactory &)> req)
|
||||||
promise = promise.exclusiveJoin(boopGC(*localStore));
|
promise = promise.exclusiveJoin(boopGC(*localStore));
|
||||||
}
|
}
|
||||||
|
|
||||||
return promise.wait(aio.waitScope).value();
|
co_return co_await promise;
|
||||||
|
} catch (...) {
|
||||||
|
co_return result::failure(std::current_exception());
|
||||||
}
|
}
|
||||||
|
|
||||||
kj::Promise<Result<Worker::Results>> Worker::runImpl(Targets topGoals)
|
kj::Promise<Result<Worker::Results>> Worker::runImpl(Targets topGoals)
|
||||||
|
|
|
@ -278,7 +278,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Loop until the specified top-level goals have finished.
|
* Loop until the specified top-level goals have finished.
|
||||||
*/
|
*/
|
||||||
Results run(std::function<Targets (GoalFactory &)> req);
|
kj::Promise<Result<Results>> run(std::function<Targets (GoalFactory &)> req);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether the given valid path exists and has the right
|
* Check whether the given valid path exists and has the right
|
||||||
|
@ -289,14 +289,18 @@ public:
|
||||||
void markContentsGood(const StorePath & path);
|
void markContentsGood(const StorePath & path);
|
||||||
|
|
||||||
template<typename MkGoals>
|
template<typename MkGoals>
|
||||||
friend Results
|
friend kj::Promise<Result<Results>> processGoals(
|
||||||
processGoals(Store & store, Store & evalStore, kj::AsyncIoContext & aio, MkGoals && mkGoals);
|
Store & store, Store & evalStore, kj::AsyncIoContext & aio, MkGoals && mkGoals
|
||||||
|
) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename MkGoals>
|
template<typename MkGoals>
|
||||||
Worker::Results
|
kj::Promise<Result<Worker::Results>> processGoals(
|
||||||
processGoals(Store & store, Store & evalStore, kj::AsyncIoContext & aio, MkGoals && mkGoals)
|
Store & store, Store & evalStore, kj::AsyncIoContext & aio, MkGoals && mkGoals
|
||||||
{
|
) noexcept
|
||||||
return Worker(store, evalStore, aio).run(std::forward<MkGoals>(mkGoals));
|
try {
|
||||||
|
co_return co_await Worker(store, evalStore, aio).run(std::forward<MkGoals>(mkGoals));
|
||||||
|
} catch (...) {
|
||||||
|
co_return result::failure(std::current_exception());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue