diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-04-06T16·40+0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-04-06T16·40+0200 |
commit | ba20730b3f7ad6b09aa86b66748df575e56d442e (patch) | |
tree | 90cf209d43d1fe35a35297c27b2ce864bdcb3480 /src/libstore/remote-store.cc | |
parent | 963f2bf12b4098a3b46059a26d21cdfe27662cdd (diff) |
Implement RemoteStore::queryMissing()
This provides a significant speedup, e.g. 64 s -> 12 s for nix-build --dry-run -I nixpkgs=channel:nixos-16.03 '<nixpkgs/nixos/tests/misc.nix>' -A test on a cold local and CloudFront cache. The alternative is to use lots of concurrent daemon connections but that seems wasteful.
Diffstat (limited to 'src/libstore/remote-store.cc')
-rw-r--r-- | src/libstore/remote-store.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index a1f2db5b0ec8..c9c590787450 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -588,6 +588,31 @@ void RemoteStore::addSignatures(const Path & storePath, const StringSet & sigs) } +void RemoteStore::queryMissing(const PathSet & targets, + PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown, + unsigned long long & downloadSize, unsigned long long & narSize) +{ + { + auto conn(connections->get()); + if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 19) + // Don't hold the connection handle in the fallback case + // to prevent a deadlock. + goto fallback; + conn->to << wopQueryMissing << targets; + conn->processStderr(); + willBuild = readStorePaths<PathSet>(*this, conn->from); + willSubstitute = readStorePaths<PathSet>(*this, conn->from); + unknown = readStorePaths<PathSet>(*this, conn->from); + conn->from >> downloadSize >> narSize; + return; + } + + fallback: + return Store::queryMissing(targets, willBuild, willSubstitute, + unknown, downloadSize, narSize); +} + + RemoteStore::Connection::~Connection() { try { |