nix-store -r: do substitutions in parallel
I.e. when multiple non-derivation arguments are passed to ‘nix-store -r’ to be substituted, do them in parallel.
This commit is contained in:
parent
42f5a2fc29
commit
1aba0bf0fa
11 changed files with 30 additions and 25 deletions
|
@ -53,7 +53,7 @@ static void prim_import(EvalState & state, Value * * args, Value & v)
|
|||
try {
|
||||
/* !!! If using a substitute, we only need to fetch
|
||||
the selected output of this derivation. */
|
||||
store->buildDerivations(singleton<PathSet>(ctx));
|
||||
store->buildPaths(singleton<PathSet>(ctx));
|
||||
} catch (Error & e) {
|
||||
throw ImportError(e.msg());
|
||||
}
|
||||
|
|
|
@ -2275,6 +2275,8 @@ public:
|
|||
/* Callback used by the worker to write to the log. */
|
||||
void handleChildOutput(int fd, const string & data);
|
||||
void handleEOF(int fd);
|
||||
|
||||
Path getStorePath() { return storePath; }
|
||||
};
|
||||
|
||||
|
||||
|
@ -2938,7 +2940,7 @@ unsigned int Worker::exitStatus()
|
|||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
void LocalStore::buildDerivations(const PathSet & drvPaths)
|
||||
void LocalStore::buildPaths(const PathSet & drvPaths)
|
||||
{
|
||||
startNest(nest, lvlDebug,
|
||||
format("building %1%") % showPaths(drvPaths));
|
||||
|
@ -2947,7 +2949,10 @@ void LocalStore::buildDerivations(const PathSet & drvPaths)
|
|||
|
||||
Goals goals;
|
||||
foreach (PathSet::const_iterator, i, drvPaths)
|
||||
if (isDerivation(*i))
|
||||
goals.insert(worker.makeDerivationGoal(*i));
|
||||
else
|
||||
goals.insert(worker.makeSubstitutionGoal(*i));
|
||||
|
||||
worker.run(goals);
|
||||
|
||||
|
@ -2955,8 +2960,8 @@ void LocalStore::buildDerivations(const PathSet & drvPaths)
|
|||
foreach (Goals::iterator, i, goals)
|
||||
if ((*i)->getExitCode() == Goal::ecFailed) {
|
||||
DerivationGoal * i2 = dynamic_cast<DerivationGoal *>(i->get());
|
||||
assert(i2);
|
||||
failed.insert(i2->getDrvPath());
|
||||
if (i2) failed.insert(i2->getDrvPath());
|
||||
else failed.insert(dynamic_cast<SubstitutionGoal *>(i->get())->getStorePath());
|
||||
}
|
||||
|
||||
if (!failed.empty())
|
||||
|
|
|
@ -150,7 +150,7 @@ public:
|
|||
|
||||
Paths importPaths(bool requireSignature, Source & source);
|
||||
|
||||
void buildDerivations(const PathSet & drvPaths);
|
||||
void buildPaths(const PathSet & paths);
|
||||
|
||||
void ensurePath(const Path & path);
|
||||
|
||||
|
|
|
@ -397,10 +397,10 @@ Paths RemoteStore::importPaths(bool requireSignature, Source & source)
|
|||
}
|
||||
|
||||
|
||||
void RemoteStore::buildDerivations(const PathSet & drvPaths)
|
||||
void RemoteStore::buildPaths(const PathSet & drvPaths)
|
||||
{
|
||||
openConnection();
|
||||
writeInt(wopBuildDerivations, to);
|
||||
writeInt(wopBuildPaths, to);
|
||||
writeStrings(drvPaths, to);
|
||||
processStderr();
|
||||
readInt(from);
|
||||
|
|
|
@ -60,7 +60,7 @@ public:
|
|||
|
||||
Paths importPaths(bool requireSignature, Source & source);
|
||||
|
||||
void buildDerivations(const PathSet & drvPaths);
|
||||
void buildPaths(const PathSet & paths);
|
||||
|
||||
void ensurePath(const Path & path);
|
||||
|
||||
|
|
|
@ -172,13 +172,15 @@ public:
|
|||
the Nix store. */
|
||||
virtual Paths importPaths(bool requireSignature, Source & source) = 0;
|
||||
|
||||
/* Ensure that the output paths of the derivation are valid. If
|
||||
/* For each path, if it's a derivation, build it. Building a
|
||||
derivation means ensuring that the output paths are valid. If
|
||||
they are already valid, this is a no-op. Otherwise, validity
|
||||
can be reached in two ways. First, if the output paths is
|
||||
substitutable, then build the path that way. Second, the
|
||||
output paths can be created by running the builder, after
|
||||
recursively building any sub-derivations. */
|
||||
virtual void buildDerivations(const PathSet & drvPaths) = 0;
|
||||
recursively building any sub-derivations. For inputs that are
|
||||
not derivations, substitute them. */
|
||||
virtual void buildPaths(const PathSet & paths) = 0;
|
||||
|
||||
/* Ensure that a path is valid. If it is not currently valid, it
|
||||
may be made valid by running a substitute (if defined for the
|
||||
|
|
|
@ -22,7 +22,7 @@ typedef enum {
|
|||
wopQueryReferrers = 6,
|
||||
wopAddToStore = 7,
|
||||
wopAddTextToStore = 8,
|
||||
wopBuildDerivations = 9,
|
||||
wopBuildPaths = 9,
|
||||
wopEnsurePath = 10,
|
||||
wopAddTempRoot = 11,
|
||||
wopAddIndirectRoot = 12,
|
||||
|
|
|
@ -695,7 +695,7 @@ static void opSet(Globals & globals,
|
|||
PathSet paths = singleton<PathSet>(drv.queryDrvPath(globals.state));
|
||||
printMissing(*store, paths);
|
||||
if (globals.dryRun) return;
|
||||
store->buildDerivations(paths);
|
||||
store->buildPaths(paths);
|
||||
}
|
||||
else {
|
||||
printMissing(*store, singleton<PathSet>(drv.queryOutPath(globals.state)));
|
||||
|
|
|
@ -45,7 +45,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
|
|||
drvsToBuild.insert(i->queryDrvPath(state));
|
||||
|
||||
debug(format("building user environment dependencies"));
|
||||
store->buildDerivations(drvsToBuild);
|
||||
store->buildPaths(drvsToBuild);
|
||||
|
||||
/* Construct the whole top level derivation. */
|
||||
PathSet references;
|
||||
|
@ -132,7 +132,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems,
|
|||
|
||||
/* Realise the resulting store expression. */
|
||||
debug("building user environment");
|
||||
store->buildDerivations(singleton<PathSet>(topLevelDrv.queryDrvPath(state)));
|
||||
store->buildPaths(singleton<PathSet>(topLevelDrv.queryDrvPath(state)));
|
||||
|
||||
/* Switch the current user environment to the output path. */
|
||||
PathLocks lock;
|
||||
|
|
|
@ -62,7 +62,7 @@ static Path useDeriver(Path path)
|
|||
static PathSet realisePath(const Path & path)
|
||||
{
|
||||
if (isDerivation(path)) {
|
||||
store->buildDerivations(singleton<PathSet>(path));
|
||||
store->buildPaths(singleton<PathSet>(path));
|
||||
Derivation drv = derivationFromPath(*store, path);
|
||||
|
||||
PathSet outputs;
|
||||
|
@ -101,13 +101,11 @@ static void opRealise(Strings opFlags, Strings opArgs)
|
|||
|
||||
if (dryRun) return;
|
||||
|
||||
/* Build all derivations at the same time to exploit parallelism. */
|
||||
PathSet drvPaths;
|
||||
foreach (Strings::iterator, i, opArgs)
|
||||
if (isDerivation(*i)) drvPaths.insert(*i);
|
||||
store->buildDerivations(drvPaths);
|
||||
/* Build all paths at the same time to exploit parallelism. */
|
||||
PathSet paths(opArgs.begin(), opArgs.end());
|
||||
store->buildPaths(paths);
|
||||
|
||||
foreach (Strings::iterator, i, opArgs) {
|
||||
foreach (Paths::iterator, i, opArgs) {
|
||||
PathSet paths = realisePath(*i);
|
||||
foreach (PathSet::iterator, j, paths)
|
||||
cout << format("%1%\n") % *j;
|
||||
|
|
|
@ -415,10 +415,10 @@ static void performOp(unsigned int clientVersion,
|
|||
break;
|
||||
}
|
||||
|
||||
case wopBuildDerivations: {
|
||||
case wopBuildPaths: {
|
||||
PathSet drvs = readStorePaths<PathSet>(from);
|
||||
startWork();
|
||||
store->buildDerivations(drvs);
|
||||
store->buildPaths(drvs);
|
||||
stopWork();
|
||||
writeInt(1, to);
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue