From 17e6ebcc90b6c7d5db8588f1d2b914c98543560b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 14 Oct 2021 14:13:57 +0200 Subject: [PATCH] Speed up GC by marking entire closures as live --- src/libstore/gc.cc | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc index 800a3fd19..03d44ebf8 100644 --- a/src/libstore/gc.cc +++ b/src/libstore/gc.cc @@ -654,12 +654,22 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) handle it again. */ if (dead.count(*path)) continue; + auto markAlive = [&]() + { + alive.insert(*path); + alive.insert(start); + try { + StorePathSet closure; + computeFSClosure(*path, closure); + for (auto & p : closure) + alive.insert(p); + } catch (InvalidPath &) { } + }; + /* If this is a root, bail out. */ if (roots.count(*path)) { debug("cannot delete '%s' because it's a root", printStorePath(*path)); - alive.insert(*path); - alive.insert(start); - return; + return markAlive(); } if (options.action == GCOptions::gcDeleteSpecific @@ -671,9 +681,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results) auto shared(_shared.lock()); if (shared->tempRoots.count(hashPart)) { debug("cannot delete '%s' because it's a temporary root", printStorePath(*path)); - alive.insert(*path); - alive.insert(start); - return; + return markAlive(); } shared->pending = hashPart; }