LegacySSHStore: Provide a faster implementation of computeFSClosure()
This avoids the latency of the standard implementation, which can make a huge difference (e.g. 16.5s -> 0.5s on a NixOS system closure).
This commit is contained in:
		
							parent
							
								
									7a716ef2a5
								
							
						
					
					
						commit
						ea7fa88131
					
				
					 2 changed files with 23 additions and 1 deletions
				
			
		|  | @ -204,6 +204,28 @@ struct LegacySSHStore : public Store | ||||||
|     bool isTrusted() override |     bool isTrusted() override | ||||||
|     { return true; } |     { return true; } | ||||||
| 
 | 
 | ||||||
|  |     void computeFSClosure(const PathSet & paths, | ||||||
|  |         PathSet & out, bool flipDirection = false, | ||||||
|  |         bool includeOutputs = false, bool includeDerivers = false) override | ||||||
|  |     { | ||||||
|  |         if (flipDirection || includeDerivers) { | ||||||
|  |             Store::computeFSClosure(paths, out, flipDirection, includeOutputs, includeDerivers); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         auto conn(connections->get()); | ||||||
|  | 
 | ||||||
|  |         conn->to | ||||||
|  |             << cmdQueryClosure | ||||||
|  |             << includeOutputs | ||||||
|  |             << paths; | ||||||
|  |         conn->to.flush(); | ||||||
|  | 
 | ||||||
|  |         auto res = readStorePaths<PathSet>(*this, conn->from); | ||||||
|  | 
 | ||||||
|  |         out.insert(res.begin(), res.end()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static RegisterStoreImplementation regStore([]( | static RegisterStoreImplementation regStore([]( | ||||||
|  |  | ||||||
|  | @ -511,7 +511,7 @@ public: | ||||||
|        `storePath' is returned; that is, the closures under the |        `storePath' is returned; that is, the closures under the | ||||||
|        `referrers' relation instead of the `references' relation is |        `referrers' relation instead of the `references' relation is | ||||||
|        returned. */ |        returned. */ | ||||||
|     void computeFSClosure(const PathSet & paths, |     virtual void computeFSClosure(const PathSet & paths, | ||||||
|         PathSet & out, bool flipDirection = false, |         PathSet & out, bool flipDirection = false, | ||||||
|         bool includeOutputs = false, bool includeDerivers = false); |         bool includeOutputs = false, bool includeDerivers = false); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue