From 5558652709f27e8a887580b77b93c705659d7a4b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 20 Jun 2013 19:26:31 +0200 Subject: [PATCH] Don't substitute derivations that have preferLocalBuild set 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. --- src/libstore/build.cc | 15 ++++++++++----- src/libstore/misc.cc | 5 +++-- src/libstore/misc.hh | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 20ed2de39..6e0a2b97b 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -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)); @@ -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"); @@ -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 @@ -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; diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc index 74ff26b9c..1bf3f9378 100644 --- a/src/libstore/misc.cc +++ b/src/libstore/misc.cc @@ -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 { @@ -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)) { diff --git a/src/libstore/misc.hh b/src/libstore/misc.hh index b4bd9ed8a..6f90ebe5e 100644 --- a/src/libstore/misc.hh +++ b/src/libstore/misc.hh @@ -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); + }