forked from lix-project/lix
Add an 'optimiseStore' remote procedure call.
This commit is contained in:
parent
27a01d92c2
commit
8fb8c26b6d
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -83,6 +83,8 @@ public:
|
|||
|
||||
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,16 +830,8 @@ 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;
|
||||
store->optimiseStore();
|
||||
}
|
||||
showOptimiseStats(stats);
|
||||
}
|
||||
|
||||
|
||||
static void opQueryFailedPaths(Strings opFlags, Strings opArgs)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue