Skip to content

Commit

Permalink
Don't substitute derivations that have preferLocalBuild set
Browse files Browse the repository at this point in the history
In particular this means that "trivial" derivations such as writeText
are not substituted, reducing the number of GET requests to the binary
cache by about 200 on a typical NixOS configuration.
  • Loading branch information
edolstra committed Jun 20, 2013
1 parent 1906cce commit 5558652
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 7 deletions.
15 changes: 10 additions & 5 deletions src/libstore/build.cc
Expand Up @@ -1072,7 +1072,7 @@ void DerivationGoal::haveDerivation()
/* We are first going to try to create the invalid output paths
through substitutes. If that doesn't work, we'll build
them. */
if (settings.useSubstitutes)
if (settings.useSubstitutes && !willBuildLocally(drv))
foreach (PathSet::iterator, i, invalidOutputs)
addWaitee(worker.makeSubstitutionGoal(*i, repair));

Expand Down Expand Up @@ -1273,6 +1273,12 @@ static bool canBuildLocally(const string & platform)
}


bool willBuildLocally(Derivation & drv)
{
return drv.env["preferLocalBuild"] == "1" && canBuildLocally(drv.platform);
}


void DerivationGoal::tryToBuild()
{
trace("trying to build");
Expand Down Expand Up @@ -1337,11 +1343,10 @@ void DerivationGoal::tryToBuild()

/* Don't do a remote build if the derivation has the attribute
`preferLocalBuild' set. */
bool preferLocalBuild =
drv.env["preferLocalBuild"] == "1" && canBuildLocally(drv.platform);
bool buildLocally = willBuildLocally(drv);

/* Is the build hook willing to accept this job? */
if (!preferLocalBuild) {
if (!buildLocally) {
switch (tryBuildHook()) {
case rpAccept:
/* Yes, it has started doing so. Wait until we get
Expand All @@ -1364,7 +1369,7 @@ void DerivationGoal::tryToBuild()
derivation prefers to be done locally, do it even if
maxBuildJobs is 0. */
unsigned int curBuilds = worker.getNrLocalBuilds();
if (curBuilds >= settings.maxBuildJobs && !(preferLocalBuild && curBuilds == 0)) {
if (curBuilds >= settings.maxBuildJobs && !(buildLocally && curBuilds == 0)) {
worker.waitForBuildSlot(shared_from_this());
outputLocks.unlock();
return;
Expand Down
5 changes: 3 additions & 2 deletions src/libstore/misc.cc
Expand Up @@ -120,7 +120,8 @@ void queryMissing(StoreAPI & store, const PathSet & targets,
if (invalid.empty()) continue;

todoDrv.insert(*i);
if (settings.useSubstitutes) query.insert(invalid.begin(), invalid.end());
if (settings.useSubstitutes && !willBuildLocally(drv))
query.insert(invalid.begin(), invalid.end());
}

else {
Expand All @@ -143,7 +144,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets,

PathSet outputs;
bool mustBuild = false;
if (settings.useSubstitutes) {
if (settings.useSubstitutes && !willBuildLocally(drv)) {
foreach (DerivationOutputs::iterator, j, drv.outputs) {
if (!wantOutput(j->first, i2.second)) continue;
if (!store.isValidPath(j->second.path)) {
Expand Down
2 changes: 2 additions & 0 deletions src/libstore/misc.hh
Expand Up @@ -32,5 +32,7 @@ void queryMissing(StoreAPI & store, const PathSet & targets,
PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown,
unsigned long long & downloadSize, unsigned long long & narSize);

bool willBuildLocally(Derivation & drv);


}

0 comments on commit 5558652

Please sign in to comment.