forked from lix-project/lix
* Added a flag --ignore-liveness' to
nix-store --delete'. It
deletes a path even if it is reachable from a root. However, it won't delete a path that still has referrers (since that would violate store invariants). Don't try this at home. It's a useful hack for recovering from certain situations in a somewhat clean way (e.g., holes in closures due to disk corruption).
This commit is contained in:
parent
4b9e7f59ca
commit
f96d2dea26
|
@ -304,7 +304,7 @@ static Paths topoSort(const PathSet & paths)
|
||||||
|
|
||||||
|
|
||||||
void collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
void collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
||||||
PathSet & result, unsigned long long & bytesFreed)
|
bool ignoreLiveness, PathSet & result, unsigned long long & bytesFreed)
|
||||||
{
|
{
|
||||||
result.clear();
|
result.clear();
|
||||||
bytesFreed = 0;
|
bytesFreed = 0;
|
||||||
|
@ -323,7 +323,8 @@ void collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
||||||
permanent roots cannot increase now. */
|
permanent roots cannot increase now. */
|
||||||
Path rootsDir = canonPath((format("%1%/%2%") % nixStateDir % gcRootsDir).str());
|
Path rootsDir = canonPath((format("%1%/%2%") % nixStateDir % gcRootsDir).str());
|
||||||
PathSet roots;
|
PathSet roots;
|
||||||
findRoots(rootsDir, true, roots);
|
if (!ignoreLiveness)
|
||||||
|
findRoots(rootsDir, true, roots);
|
||||||
|
|
||||||
if (action == gcReturnRoots) {
|
if (action == gcReturnRoots) {
|
||||||
result = roots;
|
result = roots;
|
||||||
|
|
|
@ -21,7 +21,7 @@ typedef enum {
|
||||||
set of paths not reachable from the roots. If `action' is
|
set of paths not reachable from the roots. If `action' is
|
||||||
`gcDeleteDead', actually delete the latter set. */
|
`gcDeleteDead', actually delete the latter set. */
|
||||||
void collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
void collectGarbage(GCAction action, const PathSet & pathsToDelete,
|
||||||
PathSet & result, unsigned long long & bytesFreed);
|
bool ignoreLiveness, PathSet & result, unsigned long long & bytesFreed);
|
||||||
|
|
||||||
/* Register a temporary GC root. This root will automatically
|
/* Register a temporary GC root. This root will automatically
|
||||||
disappear when this process exits. WARNING: this function should
|
disappear when this process exits. WARNING: this function should
|
||||||
|
|
|
@ -518,7 +518,7 @@ static void opGC(Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
PathSet result;
|
PathSet result;
|
||||||
PrintFreed freed(action == gcDeleteDead);
|
PrintFreed freed(action == gcDeleteDead);
|
||||||
collectGarbage(action, PathSet(), result, freed.bytesFreed);
|
collectGarbage(action, PathSet(), false, result, freed.bytesFreed);
|
||||||
|
|
||||||
if (action != gcDeleteDead) {
|
if (action != gcDeleteDead) {
|
||||||
for (PathSet::iterator i = result.begin(); i != result.end(); ++i)
|
for (PathSet::iterator i = result.begin(); i != result.end(); ++i)
|
||||||
|
@ -532,7 +532,12 @@ static void opGC(Strings opFlags, Strings opArgs)
|
||||||
roots). */
|
roots). */
|
||||||
static void opDelete(Strings opFlags, Strings opArgs)
|
static void opDelete(Strings opFlags, Strings opArgs)
|
||||||
{
|
{
|
||||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
bool ignoreLiveness;
|
||||||
|
|
||||||
|
for (Strings::iterator i = opFlags.begin();
|
||||||
|
i != opFlags.end(); ++i)
|
||||||
|
if (*i == "--ignore-liveness") ignoreLiveness = true;
|
||||||
|
else throw UsageError(format("unknown flag `%1%'") % *i);
|
||||||
|
|
||||||
PathSet pathsToDelete;
|
PathSet pathsToDelete;
|
||||||
for (Strings::iterator i = opArgs.begin();
|
for (Strings::iterator i = opArgs.begin();
|
||||||
|
@ -541,7 +546,7 @@ static void opDelete(Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
PathSet dummy;
|
PathSet dummy;
|
||||||
PrintFreed freed(true);
|
PrintFreed freed(true);
|
||||||
collectGarbage(gcDeleteSpecific, pathsToDelete,
|
collectGarbage(gcDeleteSpecific, pathsToDelete, ignoreLiveness,
|
||||||
dummy, freed.bytesFreed);
|
dummy, freed.bytesFreed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue