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…
	
	Add table
		Add a link
		
	
		Reference in a new issue