Store::computeFSClosure(): Support a set of paths
This way, callers can exploits the parallelism of computeFSClosure() when they have multiple paths that they need the (combined) closure of.
This commit is contained in:
		
							parent
							
								
									2af5d35fdc
								
							
						
					
					
						commit
						dd77f7d593
					
				
					 5 changed files with 25 additions and 16 deletions
				
			
		|  | @ -1249,8 +1249,7 @@ void DerivationGoal::inputsRealised() | |||
|         } | ||||
| 
 | ||||
|     /* Second, the input sources. */ | ||||
|     for (auto & i : drv->inputSrcs) | ||||
|         worker.store.computeFSClosure(i, inputPaths); | ||||
|     worker.store.computeFSClosure(drv->inputSrcs, inputPaths); | ||||
| 
 | ||||
|     debug(format("added input paths %1%") % showPaths(inputPaths)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ | |||
| namespace nix { | ||||
| 
 | ||||
| 
 | ||||
| void Store::computeFSClosure(const Path & startPath, | ||||
| void Store::computeFSClosure(const PathSet & startPaths, | ||||
|     PathSet & paths_, bool flipDirection, bool includeOutputs, bool includeDerivers) | ||||
| { | ||||
|     struct State | ||||
|  | @ -85,7 +85,8 @@ void Store::computeFSClosure(const Path & startPath, | |||
|             }); | ||||
|     }; | ||||
| 
 | ||||
|     enqueue(startPath); | ||||
|     for (auto & startPath : startPaths) | ||||
|         enqueue(startPath); | ||||
| 
 | ||||
|     { | ||||
|         auto state(state_.lock()); | ||||
|  | @ -95,6 +96,13 @@ void Store::computeFSClosure(const Path & startPath, | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Store::computeFSClosure(const Path & startPath, | ||||
|     PathSet & paths_, bool flipDirection, bool includeOutputs, bool includeDerivers) | ||||
| { | ||||
|     computeFSClosure(PathSet{startPath}, paths_, flipDirection, includeOutputs, includeDerivers); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Store::queryMissing(const PathSet & targets, | ||||
|     PathSet & willBuild_, PathSet & willSubstitute_, PathSet & unknown_, | ||||
|     unsigned long long & downloadSize_, unsigned long long & narSize_) | ||||
|  |  | |||
|  | @ -477,15 +477,19 @@ public: | |||
|        ensurePath(). */ | ||||
|     Derivation derivationFromPath(const Path & drvPath); | ||||
| 
 | ||||
|     /* Place in `paths' the set of all store paths in the file system
 | ||||
|     /* Place in `out' the set of all store paths in the file system
 | ||||
|        closure of `storePath'; that is, all paths than can be directly | ||||
|        or indirectly reached from it.  `paths' is not cleared.  If | ||||
|        or indirectly reached from it.  `out' is not cleared.  If | ||||
|        `flipDirection' is true, the set of paths that can reach | ||||
|        `storePath' is returned; that is, the closures under the | ||||
|        `referrers' relation instead of the `references' relation is | ||||
|        returned. */ | ||||
|     void computeFSClosure(const PathSet & paths, | ||||
|         PathSet & out, bool flipDirection = false, | ||||
|         bool includeOutputs = false, bool includeDerivers = false); | ||||
| 
 | ||||
|     void computeFSClosure(const Path & path, | ||||
|         PathSet & paths, bool flipDirection = false, | ||||
|         PathSet & out, bool flipDirection = false, | ||||
|         bool includeOutputs = false, bool includeDerivers = false); | ||||
| 
 | ||||
|     /* Given a set of paths that are to be built, return the set of
 | ||||
|  |  | |||
|  | @ -424,10 +424,9 @@ static void opQuery(Strings opFlags, Strings opArgs) | |||
|         case qRoots: { | ||||
|             PathSet referrers; | ||||
|             for (auto & i : opArgs) { | ||||
|                 PathSet paths = maybeUseOutputs(store->followLinksToStorePath(i), useOutput, forceRealise); | ||||
|                 for (auto & j : paths) | ||||
|                     store->computeFSClosure(j, referrers, true, | ||||
|                         settings.gcKeepOutputs, settings.gcKeepDerivations); | ||||
|                 store->computeFSClosure( | ||||
|                     maybeUseOutputs(store->followLinksToStorePath(i), useOutput, forceRealise), | ||||
|                     referrers, true, settings.gcKeepOutputs, settings.gcKeepDerivations); | ||||
|             } | ||||
|             Roots roots = store->findRoots(); | ||||
|             for (auto & i : roots) | ||||
|  | @ -961,10 +960,9 @@ static void opServe(Strings opFlags, Strings opArgs) | |||
| 
 | ||||
|             case cmdQueryClosure: { | ||||
|                 bool includeOutputs = readInt(in); | ||||
|                 PathSet paths = readStorePaths<PathSet>(*store, in); | ||||
|                 PathSet closure; | ||||
|                 for (auto & i : paths) | ||||
|                     store->computeFSClosure(i, closure, false, includeOutputs); | ||||
|                 store->computeFSClosure(readStorePaths<PathSet>(*store, in), | ||||
|                     closure, false, includeOutputs); | ||||
|                 out << closure; | ||||
|                 break; | ||||
|             } | ||||
|  |  | |||
|  | @ -106,8 +106,8 @@ void StorePathsCommand::run(ref<Store> store) | |||
| 
 | ||||
|         if (recursive) { | ||||
|             PathSet closure; | ||||
|             for (auto & storePath : storePaths) | ||||
|                 store->computeFSClosure(storePath, closure, false, false); | ||||
|             store->computeFSClosure(PathSet(storePaths.begin(), storePaths.end()), | ||||
|                 closure, false, false); | ||||
|             storePaths = Paths(closure.begin(), closure.end()); | ||||
|         } | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue