Memoize queryReferrers()

This commit is contained in:
Eelco Dolstra 2021-10-15 12:20:23 +02:00
parent 17e6ebcc90
commit 304180d0de

View file

@ -617,6 +617,8 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
} }
}; };
std::map<StorePath, StorePathSet> referrersCache;
/* Helper function that visits all paths reachable from `start` /* Helper function that visits all paths reachable from `start`
via the referrers edges and optionally derivers and derivation via the referrers edges and optionally derivers and derivation
output edges. If none of those paths are roots, then all output edges. If none of those paths are roots, then all
@ -689,9 +691,14 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
if (isValidPath(*path)) { if (isValidPath(*path)) {
/* Visit the referrers of this path. */ /* Visit the referrers of this path. */
auto i = referrersCache.find(*path);
if (i == referrersCache.end()) {
StorePathSet referrers; StorePathSet referrers;
queryReferrers(*path, referrers); queryReferrers(*path, referrers);
for (auto & p : referrers) referrersCache.emplace(*path, std::move(referrers));
i = referrersCache.find(*path);
}
for (auto & p : i->second)
enqueue(p); enqueue(p);
/* If keep-derivations is set and this is a /* If keep-derivations is set and this is a
@ -718,6 +725,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
if (shouldDelete) { if (shouldDelete) {
invalidatePathChecked(path); invalidatePathChecked(path);
deleteFromStore(path.to_string()); deleteFromStore(path.to_string());
referrersCache.erase(path);
} }
} }
}; };