aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/gc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/gc.cc')
-rw-r--r--src/libstore/gc.cc56
1 files changed, 3 insertions, 53 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index f58f691c9..659c636e3 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -416,12 +416,7 @@ struct LocalStore::GCState
PathSet busy;
bool gcKeepOutputs;
bool gcKeepDerivations;
-
- bool drvsIndexed;
- typedef std::multimap<string, Path> DrvsByName;
- DrvsByName drvsByName; // derivation paths hashed by name attribute
-
- GCState(GCResults & results_) : results(results_), drvsIndexed(false)
+ GCState(GCResults & results_) : results(results_)
{
}
};
@@ -441,42 +436,6 @@ bool LocalStore::isActiveTempFile(const GCState & state,
&& state.tempRoots.find(string(path, 0, path.size() - suffix.size())) != state.tempRoots.end();
}
-
-/* Return all the derivations in the Nix store that have `path' as an
- output. This function assumes that derivations have the same name
- as their outputs. */
-PathSet LocalStore::findDerivers(GCState & state, const Path & path)
-{
- PathSet derivers;
-
- Path deriver = queryDeriver(path);
- if (deriver != "") derivers.insert(deriver);
-
- if (!state.drvsIndexed) {
- Paths entries = readDirectory(nixStore);
- foreach (Paths::iterator, i, entries)
- if (isDerivation(*i))
- state.drvsByName.insert(std::pair<string, Path>(
- getNameOfStorePath(*i), nixStore + "/" + *i));
- state.drvsIndexed = true;
- }
-
- string name = getNameOfStorePath(path);
-
- // Urgh, I should have used Haskell...
- std::pair<GCState::DrvsByName::iterator, GCState::DrvsByName::iterator> range =
- state.drvsByName.equal_range(name);
-
- for (GCState::DrvsByName::iterator i = range.first; i != range.second; ++i)
- if (isValidPath(i->second)) {
- Derivation drv = derivationFromPath(i->second);
- foreach (DerivationOutputs::iterator, j, drv.outputs)
- if (j->second.path == path) derivers.insert(i->second);
- }
-
- return derivers;
-}
-
bool LocalStore::tryToDelete(GCState & state, const Path & path)
{
@@ -522,18 +481,9 @@ bool LocalStore::tryToDelete(GCState & state, const Path & path)
if (!pathExists(path)) return true;
/* If gc-keep-outputs is set, then don't delete this path if
- its deriver is not garbage. !!! Nix does not reliably
- store derivers, so we have to look at all derivations to
- determine which of them derive `path'. Since this makes
- the garbage collector very slow to start on large Nix
- stores, here we just look for all derivations that have the
- same name as `path' (where the name is the part of the
- filename after the hash, i.e. the `name' attribute of the
- derivation). This is somewhat hacky: currently, the
- deriver of a path always has the same name as the output,
- but this might change in the future. */
+ there are derivers of this path that are not garbage. */
if (state.gcKeepOutputs) {
- PathSet derivers = findDerivers(state, path);
+ PathSet derivers = queryValidDerivers(path);
foreach (PathSet::iterator, deriver, derivers) {
/* Break an infinite recursion if gc-keep-derivations
and gc-keep-outputs are both set by tentatively