diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2009-11-24T09·53+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2009-11-24T09·53+0000 |
commit | f9e766db9875e7ab390df8d405d9719b279efe3c (patch) | |
tree | 387d670ef179f242ef66231a418e1673ab2e3c6a | |
parent | ca50c83fbb8f3bfbbcc60203a518d4e5a7aa8349 (diff) |
* Randomise the order in which we delete entries to make the collector
less biased towards deleting paths that come alphabetically first (e.g. /nix/store/000...). This matters when using --max-freed etc.
-rw-r--r-- | src/libstore/gc.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 88ddad822baf..fc9791023a59 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -7,6 +7,7 @@ #include <functional> #include <queue> +#include <algorithm> #include <sys/types.h> #include <sys/stat.h> @@ -590,7 +591,7 @@ bool LocalStore::tryToDelete(GCState & state, const Path & path) state.results.paths.insert(path); return false; } - + void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) { @@ -646,13 +647,20 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) printMsg(lvlError, format("reading the Nix store...")); Paths entries = readDirectory(nixStore); + /* Randomise the order in which we delete entries to make the + collector less biased towards deleting paths that come + alphabetically first (e.g. /nix/store/000...). This + matters when using --max-freed etc. */ + vector<Path> entries_(entries.begin(), entries.end()); + random_shuffle(entries_.begin(), entries_.end()); + if (doDelete(state.options.action)) printMsg(lvlError, format("deleting garbage...")); else printMsg(lvlError, format("determining live/dead paths...")); try { - foreach (Paths::iterator, i, entries) + foreach (vector<Path>::iterator, i, entries_) tryToDelete(state, canonPath(nixStore + "/" + *i)); } catch (GCLimitReached & e) { } |