diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 88ddad822b..fc9791023a 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -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 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::iterator, i, entries_) tryToDelete(state, canonPath(nixStore + "/" + *i)); } catch (GCLimitReached & e) { }