Implement TTL for binary cache lookups

This commit is contained in:
Eelco Dolstra 2017-01-27 13:17:08 +01:00
parent f57a38b109
commit 211bc7f0e6
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE

View file

@ -42,8 +42,9 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache
{ {
public: public:
/* How long negative lookups are valid. */ /* How long negative and positive lookups are valid. */
const int ttlNegative = 3600; const int ttlNegative = 3600;
const int ttlPositive = 30 * 24 * 3600;
struct Cache struct Cache
{ {
@ -94,7 +95,7 @@ public:
"insert or replace into NARs(cache, hashPart, timestamp, present) values (?, ?, ?, 0)"); "insert or replace into NARs(cache, hashPart, timestamp, present) values (?, ?, ?, 0)");
state->queryNAR.create(state->db, 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) Cache & getCache(State & state, const std::string & uri)
@ -143,7 +144,13 @@ public:
auto & cache(getCache(*state, uri)); 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()) if (!queryNAR.next())
return {oUnknown, 0}; return {oUnknown, 0};
@ -153,8 +160,6 @@ public:
auto narInfo = make_ref<NarInfo>(); auto narInfo = make_ref<NarInfo>();
// FIXME: implement TTL.
auto namePart = queryNAR.getStr(2); auto namePart = queryNAR.getStr(2);
narInfo->path = cache.storeDir + "/" + narInfo->path = cache.storeDir + "/" +
hashPart + (namePart.empty() ? "" : "-" + namePart); hashPart + (namePart.empty() ? "" : "-" + namePart);