1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-29 06:21:14 +02:00

Merge pull request #12392 from obsidiansystems/simplify-state-machine

Simplify state machine
This commit is contained in:
Eelco Dolstra 2025-02-04 12:08:35 +01:00 committed by GitHub
commit 5c6785e0c1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 46 additions and 72 deletions

View file

@ -36,14 +36,6 @@
namespace nix { namespace nix {
Goal::Co DerivationGoal::init() {
if (useDerivation) {
co_return getDerivation();
} else {
co_return haveDerivation();
}
}
DerivationGoal::DerivationGoal(const StorePath & drvPath, DerivationGoal::DerivationGoal(const StorePath & drvPath,
const OutputsSpec & wantedOutputs, Worker & worker, BuildMode buildMode) const OutputsSpec & wantedOutputs, Worker & worker, BuildMode buildMode)
: Goal(worker, DerivedPath::Built { .drvPath = makeConstantStorePathRef(drvPath), .outputs = wantedOutputs }) : Goal(worker, DerivedPath::Built { .drvPath = makeConstantStorePathRef(drvPath), .outputs = wantedOutputs })
@ -141,26 +133,19 @@ void DerivationGoal::addWantedOutputs(const OutputsSpec & outputs)
} }
Goal::Co DerivationGoal::getDerivation() Goal::Co DerivationGoal::init() {
{
trace("init"); trace("init");
if (useDerivation) {
/* The first thing to do is to make sure that the derivation /* The first thing to do is to make sure that the derivation
exists. If it doesn't, it may be created through a exists. If it doesn't, it may be created through a
substitute. */ substitute. */
if (buildMode == bmNormal && worker.evalStore.isValidPath(drvPath)) {
co_return loadDerivation();
}
if (buildMode != bmNormal || !worker.evalStore.isValidPath(drvPath)) {
addWaitee(upcast_goal(worker.makePathSubstitutionGoal(drvPath))); addWaitee(upcast_goal(worker.makePathSubstitutionGoal(drvPath)));
co_await Suspend{}; co_await Suspend{};
co_return loadDerivation();
} }
Goal::Co DerivationGoal::loadDerivation()
{
trace("loading derivation"); trace("loading derivation");
if (nrFailed != 0) { if (nrFailed != 0) {
@ -185,6 +170,7 @@ Goal::Co DerivationGoal::loadDerivation()
} }
} }
assert(drv); assert(drv);
}
co_return haveDerivation(); co_return haveDerivation();
} }
@ -235,6 +221,7 @@ Goal::Co DerivationGoal::haveDerivation()
} }
}); });
{
/* Check what outputs paths are not already valid. */ /* Check what outputs paths are not already valid. */
auto [allValid, validOutputs] = checkPathValidity(); auto [allValid, validOutputs] = checkPathValidity();
@ -242,6 +229,7 @@ Goal::Co DerivationGoal::haveDerivation()
if (allValid && buildMode == bmNormal) { if (allValid && buildMode == bmNormal) {
co_return done(BuildResult::AlreadyValid, std::move(validOutputs)); co_return done(BuildResult::AlreadyValid, std::move(validOutputs));
} }
}
/* We are first going to try to create the invalid output paths /* We are first going to try to create the invalid output paths
through substitutes. If that doesn't work, we'll build through substitutes. If that doesn't work, we'll build
@ -268,12 +256,7 @@ Goal::Co DerivationGoal::haveDerivation()
} }
if (!waitees.empty()) co_await Suspend{}; /* to prevent hang (no wake-up event) */ if (!waitees.empty()) co_await Suspend{}; /* to prevent hang (no wake-up event) */
co_return outputsSubstitutionTried();
}
Goal::Co DerivationGoal::outputsSubstitutionTried()
{
trace("all outputs substituted (maybe)"); trace("all outputs substituted (maybe)");
assert(!drv->type().isImpure()); assert(!drv->type().isImpure());
@ -460,19 +443,14 @@ Goal::Co DerivationGoal::repairClosure()
co_return done(BuildResult::AlreadyValid, assertPathValidity()); co_return done(BuildResult::AlreadyValid, assertPathValidity());
} else { } else {
co_await Suspend{}; co_await Suspend{};
co_return closureRepaired();
}
}
Goal::Co DerivationGoal::closureRepaired()
{
trace("closure repaired"); trace("closure repaired");
if (nrFailed > 0) if (nrFailed > 0)
throw Error("some paths in the output closure of derivation '%s' could not be repaired", throw Error("some paths in the output closure of derivation '%s' could not be repaired",
worker.store.printStorePath(drvPath)); worker.store.printStorePath(drvPath));
co_return done(BuildResult::AlreadyValid, assertPathValidity()); co_return done(BuildResult::AlreadyValid, assertPathValidity());
} }
}
Goal::Co DerivationGoal::inputsRealised() Goal::Co DerivationGoal::inputsRealised()

View file

@ -233,12 +233,8 @@ struct DerivationGoal : public Goal
* The states. * The states.
*/ */
Co init() override; Co init() override;
Co getDerivation();
Co loadDerivation();
Co haveDerivation(); Co haveDerivation();
Co outputsSubstitutionTried();
Co gaveUpOnSubstitution(); Co gaveUpOnSubstitution();
Co closureRepaired();
Co inputsRealised(); Co inputsRealised();
Co tryToBuild(); Co tryToBuild();
virtual Co tryLocalBuild(); virtual Co tryLocalBuild();