diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-04-15T13·25+0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-04-15T13·39+0200 |
commit | a7d8eaba540ce272bc4fc19afdeae177a3b086d9 (patch) | |
tree | 9ddb9fe60a9e5d35869e07c65f90cf55c7b8f5af | |
parent | d1b0909894a302540f979d904dd378af1cad620c (diff) |
BinaryCacheStore: Do negative caching of .narinfo lookups
-rw-r--r-- | src/libstore/binary-cache-store.cc | 12 | ||||
-rw-r--r-- | src/libstore/binary-cache-store.hh | 3 |
2 files changed, 12 insertions, 3 deletions
diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc index 7c8fdfd0811c..7016eedfa701 100644 --- a/src/libstore/binary-cache-store.cc +++ b/src/libstore/binary-cache-store.cc @@ -114,14 +114,22 @@ NarInfo BinaryCacheStore::readNarInfo(const Path & storePath) auto res = state_->narInfoCache.get(storePath); if (res) { stats.narInfoReadAverted++; + if (!*res) + throw InvalidPath(format("path ‘%s’ is not valid") % storePath); return **res; } } auto narInfoFile = narInfoFileFor(storePath); auto data = getFile(narInfoFile); - if (!data) + if (!data) { + stats.narInfoMissing++; + auto state_(state.lock()); + state_->narInfoCache.upsert(storePath, 0); + stats.narInfoCacheSize = state_->narInfoCache.size(); throw InvalidPath(format("path ‘%s’ is not valid") % storePath); + } + auto narInfo = make_ref<NarInfo>(*data, narInfoFile); if (narInfo->path != storePath) throw Error(format("NAR info file for store path ‘%1%’ does not match ‘%2%’") % narInfo->path % storePath); @@ -149,7 +157,7 @@ bool BinaryCacheStore::isValidPath(const Path & storePath) auto res = state_->narInfoCache.get(storePath); if (res) { stats.narInfoReadAverted++; - return true; + return *res != 0; } } diff --git a/src/libstore/binary-cache-store.hh b/src/libstore/binary-cache-store.hh index 55bba627825c..dcf06b3d1bbc 100644 --- a/src/libstore/binary-cache-store.hh +++ b/src/libstore/binary-cache-store.hh @@ -24,7 +24,7 @@ private: struct State { - LRUCache<Path, ref<NarInfo>> narInfoCache{32 * 1024}; + LRUCache<Path, std::shared_ptr<NarInfo>> narInfoCache{32 * 1024}; }; Sync<State> state; @@ -51,6 +51,7 @@ public: { std::atomic<uint64_t> narInfoRead{0}; std::atomic<uint64_t> narInfoReadAverted{0}; + std::atomic<uint64_t> narInfoMissing{0}; std::atomic<uint64_t> narInfoWrite{0}; std::atomic<uint64_t> narInfoCacheSize{0}; std::atomic<uint64_t> narRead{0}; |