about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-01-27T12·17+0100
committerEelco Dolstra <edolstra@gmail.com>2017-01-27T12·17+0100
commit211bc7f0e6daa65fe4083334e2411bc441067904 (patch)
tree105c13d4692005dead850adee4381767a5bf7b16 /src
parentf57a38b109dbea26239a1cc001ff4b608006af6d (diff)
Implement TTL for binary cache lookups
Diffstat (limited to 'src')
-rw-r--r--src/libstore/nar-info-disk-cache.cc15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc
index ff4bd651aa53..ed2f18ffe829 100644
--- a/src/libstore/nar-info-disk-cache.cc
+++ b/src/libstore/nar-info-disk-cache.cc
@@ -42,8 +42,9 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache
 {
 public:
 
-    /* How long negative lookups are valid. */
+    /* How long negative and positive lookups are valid. */
     const int ttlNegative = 3600;
+    const int ttlPositive = 30 * 24 * 3600;
 
     struct Cache
     {
@@ -94,7 +95,7 @@ public:
             "insert or replace into NARs(cache, hashPart, timestamp, present) values (?, ?, ?, 0)");
 
         state->queryNAR.create(state->db,
-            "select * from NARs where cache = ? and hashPart = ?");
+            "select * from NARs where cache = ? and hashPart = ? and ((present = 0 and timestamp > ?) or (present = 1 and timestamp > ?))");
     }
 
     Cache & getCache(State & state, const std::string & uri)
@@ -143,7 +144,13 @@ public:
 
         auto & cache(getCache(*state, uri));
 
-        auto queryNAR(state->queryNAR.use()(cache.id)(hashPart));
+        auto now = time(0);
+
+        auto queryNAR(state->queryNAR.use()
+            (cache.id)
+            (hashPart)
+            (now - ttlNegative)
+            (now - ttlPositive));
 
         if (!queryNAR.next())
             return {oUnknown, 0};
@@ -153,8 +160,6 @@ public:
 
         auto narInfo = make_ref<NarInfo>();
 
-        // FIXME: implement TTL.
-
         auto namePart = queryNAR.getStr(2);
         narInfo->path = cache.storeDir + "/" +
             hashPart + (namePart.empty() ? "" : "-" + namePart);