aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-03-16 11:44:01 +0100
committerEelco Dolstra <edolstra@gmail.com>2017-03-16 11:44:52 +0100
commitea7fa88131eb486ffe54f32601d36a64374f7b7c (patch)
tree2d992af6444a592910de29406b717169cdc94d63 /src
parent7a716ef2a5759506e602f3ceaaadc42edbf6d12f (diff)
LegacySSHStore: Provide a faster implementation of computeFSClosure()
This avoids the latency of the standard implementation, which can make a huge difference (e.g. 16.5s -> 0.5s on a NixOS system closure).
Diffstat (limited to 'src')
-rw-r--r--src/libstore/legacy-ssh-store.cc22
-rw-r--r--src/libstore/store-api.hh2
2 files changed, 23 insertions, 1 deletions
diff --git a/src/libstore/legacy-ssh-store.cc b/src/libstore/legacy-ssh-store.cc
index d804b27c1..1a933259b 100644
--- a/src/libstore/legacy-ssh-store.cc
+++ b/src/libstore/legacy-ssh-store.cc
@@ -204,6 +204,28 @@ struct LegacySSHStore : public Store
bool isTrusted() override
{ return true; }
+ void computeFSClosure(const PathSet & paths,
+ PathSet & out, bool flipDirection = false,
+ bool includeOutputs = false, bool includeDerivers = false) override
+ {
+ if (flipDirection || includeDerivers) {
+ Store::computeFSClosure(paths, out, flipDirection, includeOutputs, includeDerivers);
+ return;
+ }
+
+ auto conn(connections->get());
+
+ conn->to
+ << cmdQueryClosure
+ << includeOutputs
+ << paths;
+ conn->to.flush();
+
+ auto res = readStorePaths<PathSet>(*this, conn->from);
+
+ out.insert(res.begin(), res.end());
+ }
+
};
static RegisterStoreImplementation regStore([](
diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh
index 3aea30c28..92aa8862f 100644
--- a/src/libstore/store-api.hh
+++ b/src/libstore/store-api.hh
@@ -511,7 +511,7 @@ public:
`storePath' is returned; that is, the closures under the
`referrers' relation instead of the `references' relation is
returned. */
- void computeFSClosure(const PathSet & paths,
+ virtual void computeFSClosure(const PathSet & paths,
PathSet & out, bool flipDirection = false,
bool includeOutputs = false, bool includeDerivers = false);