Memoise checkSourcePath()
This prevents hydra-eval-jobs from statting the same files over and over again.
This commit is contained in:
		
							parent
							
								
									9064dd2f4d
								
							
						
					
					
						commit
						9fd7cf98db
					
				
					 2 changed files with 11 additions and 1 deletions
				
			
		|  | @ -352,6 +352,10 @@ Path EvalState::checkSourcePath(const Path & path_) | |||
| { | ||||
|     if (!allowedPaths) return path_; | ||||
| 
 | ||||
|     auto i = resolvedPaths.find(path_); | ||||
|     if (i != resolvedPaths.end()) | ||||
|         return i->second; | ||||
| 
 | ||||
|     bool found = false; | ||||
| 
 | ||||
|     for (auto & i : *allowedPaths) { | ||||
|  | @ -369,9 +373,11 @@ Path EvalState::checkSourcePath(const Path & path_) | |||
|     Path path = canonPath(path_, true); | ||||
| 
 | ||||
|     for (auto & i : *allowedPaths) { | ||||
|         if (isDirOrInDir(path, i)) | ||||
|         if (isDirOrInDir(path, i)) { | ||||
|             resolvedPaths[path_] = path; | ||||
|             return path; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     throw RestrictedPathError("access to path '%1%' is forbidden in restricted mode", path); | ||||
| } | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
| #include "hash.hh" | ||||
| 
 | ||||
| #include <map> | ||||
| #include <unordered_map> | ||||
| 
 | ||||
| 
 | ||||
| namespace nix { | ||||
|  | @ -100,6 +101,9 @@ private: | |||
| 
 | ||||
|     std::map<std::string, std::pair<bool, std::string>> searchPathResolved; | ||||
| 
 | ||||
|     /* Cache used by checkSourcePath(). */ | ||||
|     std::unordered_map<Path, Path> resolvedPaths; | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|     EvalState(const Strings & _searchPath, ref<Store> store); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue