mirror of
https://github.com/NixOS/nix
synced 2025-07-04 07:11:47 +02:00
* Some refactoring: put the GC options / results in separate structs.
* The garbage collector now also prints the number of blocks freed.
This commit is contained in:
parent
934c58aa38
commit
a72709afd8
15 changed files with 252 additions and 166 deletions
|
@ -489,19 +489,19 @@ static void opCheckValidity(Strings opFlags, Strings opArgs)
|
|||
}
|
||||
|
||||
|
||||
static string showBytes(unsigned long long bytes)
|
||||
static string showBytes(unsigned long long bytes, unsigned long long blocks)
|
||||
{
|
||||
return (format("%d bytes (%.2f MiB)")
|
||||
% bytes % (bytes / (1024.0 * 1024.0))).str();
|
||||
return (format("%d bytes (%.2f MiB, %d blocks)")
|
||||
% bytes % (bytes / (1024.0 * 1024.0)) % blocks).str();
|
||||
}
|
||||
|
||||
|
||||
struct PrintFreed
|
||||
{
|
||||
bool show, dryRun;
|
||||
unsigned long long bytesFreed;
|
||||
PrintFreed(bool show, bool dryRun)
|
||||
: show(show), dryRun(dryRun), bytesFreed(0) { }
|
||||
const GCResults & results;
|
||||
PrintFreed(bool show, bool dryRun, const GCResults & results)
|
||||
: show(show), dryRun(dryRun), results(results) { }
|
||||
~PrintFreed()
|
||||
{
|
||||
if (show)
|
||||
|
@ -509,33 +509,35 @@ struct PrintFreed
|
|||
(dryRun
|
||||
? "%1% would be freed\n"
|
||||
: "%1% freed\n"))
|
||||
% showBytes(bytesFreed);
|
||||
% showBytes(results.bytesFreed, results.blocksFreed);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static void opGC(Strings opFlags, Strings opArgs)
|
||||
{
|
||||
GCAction action = gcDeleteDead;
|
||||
GCOptions options;
|
||||
options.action = GCOptions::gcDeleteDead;
|
||||
|
||||
GCResults results;
|
||||
|
||||
/* Do what? */
|
||||
for (Strings::iterator i = opFlags.begin();
|
||||
i != opFlags.end(); ++i)
|
||||
if (*i == "--print-roots") action = gcReturnRoots;
|
||||
else if (*i == "--print-live") action = gcReturnLive;
|
||||
else if (*i == "--print-dead") action = gcReturnDead;
|
||||
else if (*i == "--delete") action = gcDeleteDead;
|
||||
if (*i == "--print-roots") options.action = GCOptions::gcReturnRoots;
|
||||
else if (*i == "--print-live") options.action = GCOptions::gcReturnLive;
|
||||
else if (*i == "--print-dead") options.action = GCOptions::gcReturnDead;
|
||||
else if (*i == "--delete") options.action = GCOptions::gcDeleteDead;
|
||||
else throw UsageError(format("bad sub-operation `%1%' in GC") % *i);
|
||||
|
||||
PathSet result;
|
||||
PrintFreed freed(action == gcDeleteDead || action == gcReturnDead,
|
||||
action == gcReturnDead);
|
||||
store->collectGarbage(action, PathSet(), false, result, freed.bytesFreed);
|
||||
PrintFreed freed(
|
||||
options.action == GCOptions::gcDeleteDead || options.action == GCOptions::gcReturnDead,
|
||||
options.action == GCOptions::gcReturnDead, results);
|
||||
store->collectGarbage(options, results);
|
||||
|
||||
if (action != gcDeleteDead) {
|
||||
for (PathSet::iterator i = result.begin(); i != result.end(); ++i)
|
||||
if (options.action != GCOptions::gcDeleteDead)
|
||||
foreach (PathSet::iterator, i, results.paths)
|
||||
cout << *i << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -544,22 +546,21 @@ static void opGC(Strings opFlags, Strings opArgs)
|
|||
roots). */
|
||||
static void opDelete(Strings opFlags, Strings opArgs)
|
||||
{
|
||||
bool ignoreLiveness = false;
|
||||
GCOptions options;
|
||||
options.action = GCOptions::gcDeleteSpecific;
|
||||
|
||||
for (Strings::iterator i = opFlags.begin();
|
||||
i != opFlags.end(); ++i)
|
||||
if (*i == "--ignore-liveness") ignoreLiveness = true;
|
||||
if (*i == "--ignore-liveness") options.ignoreLiveness = true;
|
||||
else throw UsageError(format("unknown flag `%1%'") % *i);
|
||||
|
||||
PathSet pathsToDelete;
|
||||
for (Strings::iterator i = opArgs.begin();
|
||||
i != opArgs.end(); ++i)
|
||||
pathsToDelete.insert(followLinksToStorePath(*i));
|
||||
options.pathsToDelete.insert(followLinksToStorePath(*i));
|
||||
|
||||
PathSet dummy;
|
||||
PrintFreed freed(true, false);
|
||||
store->collectGarbage(gcDeleteSpecific, pathsToDelete, ignoreLiveness,
|
||||
dummy, freed.bytesFreed);
|
||||
GCResults results;
|
||||
PrintFreed freed(true, false, results);
|
||||
store->collectGarbage(options, results);
|
||||
}
|
||||
|
||||
|
||||
|
@ -653,7 +654,7 @@ static void showOptimiseStats(OptimiseStats & stats)
|
|||
{
|
||||
printMsg(lvlError,
|
||||
format("%1% freed by hard-linking %2% files; there are %3% files with equal contents out of %4% files in total")
|
||||
% showBytes(stats.bytesFreed)
|
||||
% showBytes(stats.bytesFreed, stats.blocksFreed)
|
||||
% stats.filesLinked
|
||||
% stats.sameContents
|
||||
% stats.totalFiles);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue