1
0
Fork 0
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:
Eelco Dolstra 2008-06-18 09:34:17 +00:00
parent 934c58aa38
commit a72709afd8
15 changed files with 252 additions and 166 deletions

View file

@ -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);