aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-04-06 14:30:31 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-04-06 14:30:31 +0200
commit256940fc48a6db950136fb0bc43590b701a3e857 (patch)
tree33ce2b1e13f0aba27d4046c5fa2364a758583520 /src
parent8decb07c31581febab664bedde12c8bf1367279e (diff)
nix-daemon: Disable path info cache
This is useless because the client also caches path info, and can cause problems for long-running clients like hydra-queue-runner (i.e. it may return cached info about paths that have been garbage-collected).
Diffstat (limited to 'src')
-rw-r--r--src/libstore/store-api.cc1
-rw-r--r--src/libstore/store-api.hh7
-rw-r--r--src/libutil/lru-cache.hh8
-rw-r--r--src/libutil/sync.hh1
-rw-r--r--src/nix-daemon/nix-daemon.cc5
5 files changed, 17 insertions, 5 deletions
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index 441166d04..59348c5d0 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -242,6 +242,7 @@ Path Store::computeStorePathForText(const string & name, const string & s,
Store::Store(const Params & params)
: storeDir(get(params, "store", settings.nixStore))
+ , state({std::stoi(get(params, "path-info-cache-size", "65536"))})
{
}
diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh
index 98f2803f8..f58dbde35 100644
--- a/src/libstore/store-api.hh
+++ b/src/libstore/store-api.hh
@@ -241,7 +241,7 @@ protected:
struct State
{
- LRUCache<std::string, std::shared_ptr<ValidPathInfo>> pathInfoCache{64 * 1024};
+ LRUCache<std::string, std::shared_ptr<ValidPathInfo>> pathInfoCache;
};
Sync<State> state;
@@ -252,6 +252,11 @@ protected:
public:
+ size_t getCacheSize()
+ {
+ return state.lock()->pathInfoCache.size();
+ }
+
virtual ~Store() { }
virtual std::string getUri() = 0;
diff --git a/src/libutil/lru-cache.hh b/src/libutil/lru-cache.hh
index 35983aa2c..3cb5d5088 100644
--- a/src/libutil/lru-cache.hh
+++ b/src/libutil/lru-cache.hh
@@ -11,7 +11,7 @@ class LRUCache
{
private:
- size_t maxSize;
+ size_t capacity;
// Stupid wrapper to get around circular dependency between Data
// and LRU.
@@ -27,14 +27,16 @@ private:
public:
- LRUCache(size_t maxSize) : maxSize(maxSize) { }
+ LRUCache(size_t capacity) : capacity(capacity) { }
/* Insert or upsert an item in the cache. */
void upsert(const Key & key, const Value & value)
{
+ if (capacity == 0) return;
+
erase(key);
- if (data.size() >= maxSize) {
+ if (data.size() >= capacity) {
/* Retire the oldest item. */
auto oldest = lru.begin();
data.erase(*oldest);
diff --git a/src/libutil/sync.hh b/src/libutil/sync.hh
index 2aa074299..611c900e0 100644
--- a/src/libutil/sync.hh
+++ b/src/libutil/sync.hh
@@ -33,6 +33,7 @@ public:
Sync() { }
Sync(const T & data) : data(data) { }
+ Sync(T && data) noexcept : data(std::move(data)) { }
class Lock
{
diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc
index ab5826b0d..b6a46642c 100644
--- a/src/nix-daemon/nix-daemon.cc
+++ b/src/nix-daemon/nix-daemon.cc
@@ -637,7 +637,10 @@ static void processConnection(bool trusted)
#endif
/* Open the store. */
- auto store = make_ref<LocalStore>(Store::Params()); // FIXME: get params from somewhere
+ Store::Params params; // FIXME: get params from somewhere
+ // Disable caching since the client already does that.
+ params["path-info-cache-size"] = "0";
+ auto store = make_ref<LocalStore>(params);
stopWork();
to.flush();