diff options
-rw-r--r-- | src/libstore/local-store.cc | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 41e1c37a0572..4f2c433b88d1 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -781,14 +781,27 @@ Path LocalStore::queryPathFromHashPart(const string & hashPart) PathSet LocalStore::querySubstitutablePaths(const PathSet & paths) { if (!settings.useSubstitutes) return PathSet(); + + auto remaining = paths; PathSet res; + for (auto & sub : getDefaultSubstituters()) { - if (res.size() == paths.size()) break; + if (remaining.empty()) break; if (sub->storeDir != storeDir) continue; if (!sub->wantMassQuery()) continue; - for (auto path : sub->queryValidPaths(paths)) - res.insert(path); + + auto valid = sub->queryValidPaths(remaining); + + PathSet remaining2; + for (auto & path : remaining) + if (valid.count(path)) + res.insert(path); + else + remaining2.insert(path); + + std::swap(remaining, remaining2); } + return res; } |