Add an 'optimiseStore' remote procedure call.
This commit is contained in:
		
							parent
							
								
									27a01d92c2
								
							
						
					
					
						commit
						8fb8c26b6d
					
				
					 8 changed files with 42 additions and 20 deletions
				
			
		|  | @ -167,6 +167,9 @@ public: | |||
|        files with the same contents. */ | ||||
|     void optimiseStore(OptimiseStats & stats); | ||||
| 
 | ||||
|     /* Generic variant of the above method.  */ | ||||
|     void optimiseStore(); | ||||
| 
 | ||||
|     /* Optimise a single store path. */ | ||||
|     void optimisePath(const Path & path); | ||||
| 
 | ||||
|  |  | |||
|  | @ -225,6 +225,22 @@ void LocalStore::optimiseStore(OptimiseStats & stats) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| static string showBytes(unsigned long long bytes) | ||||
| { | ||||
|     return (format("%.2f MiB") % (bytes / (1024.0 * 1024.0))).str(); | ||||
| } | ||||
| 
 | ||||
| void LocalStore::optimiseStore() | ||||
| { | ||||
|     OptimiseStats stats; | ||||
| 
 | ||||
|     optimiseStore(stats); | ||||
| 
 | ||||
|     printMsg(lvlError, | ||||
|         format("%1% freed by hard-linking %2% files") | ||||
|         % showBytes(stats.bytesFreed) | ||||
|         % stats.filesLinked); | ||||
| } | ||||
| 
 | ||||
| void LocalStore::optimisePath(const Path & path) | ||||
| { | ||||
|  |  | |||
|  | @ -579,6 +579,13 @@ void RemoteStore::clearFailedPaths(const PathSet & paths) | |||
|     readInt(from); | ||||
| } | ||||
| 
 | ||||
| void RemoteStore::optimiseStore() | ||||
| { | ||||
|     openConnection(); | ||||
|     writeInt(wopOptimiseStore, to); | ||||
|     processStderr(); | ||||
|     readInt(from); | ||||
| } | ||||
| 
 | ||||
| void RemoteStore::processStderr(Sink * sink, Source * source) | ||||
| { | ||||
|  |  | |||
|  | @ -82,7 +82,9 @@ public: | |||
|     PathSet queryFailedPaths(); | ||||
| 
 | ||||
|     void clearFailedPaths(const PathSet & paths); | ||||
|      | ||||
| 
 | ||||
|     void optimiseStore(); | ||||
| 
 | ||||
| private: | ||||
|     AutoCloseFD fdSocket; | ||||
|     FdSink to; | ||||
|  |  | |||
|  | @ -250,6 +250,10 @@ public: | |||
|        `nix-store --register-validity'. */ | ||||
|     string makeValidityRegistration(const PathSet & paths, | ||||
|         bool showDerivers, bool showHash); | ||||
| 
 | ||||
|     /* Optimise the disk space usage of the Nix store by hard-linking files
 | ||||
|        with the same contents. */ | ||||
|     virtual void optimiseStore() = 0; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -42,6 +42,7 @@ typedef enum { | |||
|     wopQueryValidPaths = 31, | ||||
|     wopQuerySubstitutablePaths = 32, | ||||
|     wopQueryValidDerivers = 33, | ||||
|     wopOptimiseStore = 34 | ||||
| } WorkerOp; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -508,6 +508,13 @@ static void performOp(bool trusted, unsigned int clientVersion, | |||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     case wopOptimiseStore: | ||||
| 	startWork(); | ||||
| 	store->optimiseStore(); | ||||
| 	stopWork(); | ||||
| 	writeInt(1, to); | ||||
| 	break; | ||||
| 
 | ||||
|     default: | ||||
|         throw Error(format("invalid operation %1%") % op); | ||||
|     } | ||||
|  |  | |||
|  | @ -823,16 +823,6 @@ static void opRepairPath(Strings opFlags, Strings opArgs) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void showOptimiseStats(OptimiseStats & stats) | ||||
| { | ||||
|     printMsg(lvlError, | ||||
|         format("%1% freed by hard-linking %2% files") | ||||
|         % showBytes(stats.bytesFreed) | ||||
|         % stats.filesLinked); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Optimise the disk space usage of the Nix store by hard-linking
 | ||||
|    files with the same contents. */ | ||||
| static void opOptimise(Strings opFlags, Strings opArgs) | ||||
|  | @ -840,17 +830,9 @@ static void opOptimise(Strings opFlags, Strings opArgs) | |||
|     if (!opArgs.empty() || !opFlags.empty()) | ||||
|         throw UsageError("no arguments expected"); | ||||
| 
 | ||||
|     OptimiseStats stats; | ||||
|     try { | ||||
|         ensureLocalStore().optimiseStore(stats); | ||||
|     } catch (...) { | ||||
|         showOptimiseStats(stats); | ||||
|         throw; | ||||
|     } | ||||
|     showOptimiseStats(stats); | ||||
|     store->optimiseStore(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static void opQueryFailedPaths(Strings opFlags, Strings opArgs) | ||||
| { | ||||
|     if (!opArgs.empty() || !opFlags.empty()) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue