forked from lix-project/lix
Memoize queryReferrers()
This commit is contained in:
parent
17e6ebcc90
commit
304180d0de
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue