aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/remote-store.cc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-19 18:50:15 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-19 18:52:53 +0200
commite0204f8d462041387651af388074491fd0bf36d6 (patch)
treeecd20759ce49499722d140d653c5678051bcdfc2 /src/libstore/remote-store.cc
parent608b0265e104b4a97f51e5745b1a32078770f3cf (diff)
Move path info caching from BinaryCacheStore to Store
Caching path info is generally useful. For instance, it speeds up "nix path-info -rS /run/current-system" (i.e. showing the closure sizes of all paths in the closure of the current system) from 5.6s to 0.15s. This also eliminates some APIs like Store::queryDeriver() and Store::queryReferences().
Diffstat (limited to 'src/libstore/remote-store.cc')
-rw-r--r--src/libstore/remote-store.cc62
1 files changed, 18 insertions, 44 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 761e83548..551963976 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -141,7 +141,7 @@ void RemoteStore::setOptions(ref<Connection> conn)
}
-bool RemoteStore::isValidPath(const Path & path)
+bool RemoteStore::isValidPathUncached(const Path & path)
{
auto conn(connections->get());
conn->to << wopIsValidPath << path;
@@ -239,48 +239,27 @@ void RemoteStore::querySubstitutablePathInfos(const PathSet & paths,
}
-ValidPathInfo RemoteStore::queryPathInfo(const Path & path)
+std::shared_ptr<ValidPathInfo> RemoteStore::queryPathInfoUncached(const Path & path)
{
auto conn(connections->get());
conn->to << wopQueryPathInfo << path;
conn->processStderr();
- ValidPathInfo info;
- info.path = path;
- info.deriver = readString(conn->from);
- if (info.deriver != "") assertStorePath(info.deriver);
- info.narHash = parseHash(htSHA256, readString(conn->from));
- info.references = readStorePaths<PathSet>(conn->from);
- info.registrationTime = readInt(conn->from);
- info.narSize = readLongLong(conn->from);
+ auto info = std::make_shared<ValidPathInfo>();
+ info->path = path;
+ info->deriver = readString(conn->from);
+ if (info->deriver != "") assertStorePath(info->deriver);
+ info->narHash = parseHash(htSHA256, readString(conn->from));
+ info->references = readStorePaths<PathSet>(conn->from);
+ info->registrationTime = readInt(conn->from);
+ info->narSize = readLongLong(conn->from);
if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 16) {
- info.ultimate = readInt(conn->from) != 0;
- info.sigs = readStrings<StringSet>(conn->from);
+ info->ultimate = readInt(conn->from) != 0;
+ info->sigs = readStrings<StringSet>(conn->from);
}
return info;
}
-Hash RemoteStore::queryPathHash(const Path & path)
-{
- auto conn(connections->get());
- conn->to << wopQueryPathHash << path;
- conn->processStderr();
- string hash = readString(conn->from);
- return parseHash(htSHA256, hash);
-}
-
-
-void RemoteStore::queryReferences(const Path & path,
- PathSet & references)
-{
- auto conn(connections->get());
- conn->to << wopQueryReferences << path;
- conn->processStderr();
- PathSet references2 = readStorePaths<PathSet>(conn->from);
- references.insert(references2.begin(), references2.end());
-}
-
-
void RemoteStore::queryReferrers(const Path & path,
PathSet & referrers)
{
@@ -292,17 +271,6 @@ void RemoteStore::queryReferrers(const Path & path,
}
-Path RemoteStore::queryDeriver(const Path & path)
-{
- auto conn(connections->get());
- conn->to << wopQueryDeriver << path;
- conn->processStderr();
- Path drvPath = readString(conn->from);
- if (drvPath != "") assertStorePath(drvPath);
- return drvPath;
-}
-
-
PathSet RemoteStore::queryValidDerivers(const Path & path)
{
auto conn(connections->get());
@@ -517,6 +485,12 @@ void RemoteStore::collectGarbage(const GCOptions & options, GCResults & results)
results.paths = readStrings<PathSet>(conn->from);
results.bytesFreed = readLongLong(conn->from);
readLongLong(conn->from); // obsolete
+
+ {
+ auto state_(Store::state.lock());
+ state_->pathInfoCache.clear();
+ stats.pathInfoCacheSize = 0;
+ }
}