From f9e766db9875e7ab390df8d405d9719b279efe3c Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 24 Nov 2009 09:53:18 +0000 Subject: [PATCH] * 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. --- src/libstore/gc.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 88ddad822..fc9791023 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) { }