Periodically purge binary-cache.sqlite
This commit is contained in:
parent
211bc7f0e6
commit
cb1951e746
|
@ -36,6 +36,11 @@ create table if not exists NARs (
|
||||||
foreign key (cache) references BinaryCaches(id) on delete cascade
|
foreign key (cache) references BinaryCaches(id) on delete cascade
|
||||||
);
|
);
|
||||||
|
|
||||||
|
create table if not exists LastPurge (
|
||||||
|
dummy text primary key,
|
||||||
|
value integer
|
||||||
|
);
|
||||||
|
|
||||||
)sql";
|
)sql";
|
||||||
|
|
||||||
class NarInfoDiskCacheImpl : public NarInfoDiskCache
|
class NarInfoDiskCacheImpl : public NarInfoDiskCache
|
||||||
|
@ -46,6 +51,9 @@ public:
|
||||||
const int ttlNegative = 3600;
|
const int ttlNegative = 3600;
|
||||||
const int ttlPositive = 30 * 24 * 3600;
|
const int ttlPositive = 30 * 24 * 3600;
|
||||||
|
|
||||||
|
/* How often to purge expired entries from the cache. */
|
||||||
|
const int purgeInterval = 24 * 3600;
|
||||||
|
|
||||||
struct Cache
|
struct Cache
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
|
@ -57,7 +65,7 @@ public:
|
||||||
struct State
|
struct State
|
||||||
{
|
{
|
||||||
SQLite db;
|
SQLite db;
|
||||||
SQLiteStmt insertCache, queryCache, insertNAR, insertMissingNAR, queryNAR;
|
SQLiteStmt insertCache, queryCache, insertNAR, insertMissingNAR, queryNAR, purgeCache;
|
||||||
std::map<std::string, Cache> caches;
|
std::map<std::string, Cache> caches;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -96,6 +104,27 @@ public:
|
||||||
|
|
||||||
state->queryNAR.create(state->db,
|
state->queryNAR.create(state->db,
|
||||||
"select * from NARs where cache = ? and hashPart = ? and ((present = 0 and timestamp > ?) or (present = 1 and timestamp > ?))");
|
"select * from NARs where cache = ? and hashPart = ? and ((present = 0 and timestamp > ?) or (present = 1 and timestamp > ?))");
|
||||||
|
|
||||||
|
/* Periodically purge expired entries from the database. */
|
||||||
|
auto now = time(0);
|
||||||
|
|
||||||
|
SQLiteStmt queryLastPurge(state->db, "select value from LastPurge");
|
||||||
|
auto queryLastPurge_(queryLastPurge.use());
|
||||||
|
|
||||||
|
if (!queryLastPurge_.next() || queryLastPurge_.getInt(0) < now - purgeInterval) {
|
||||||
|
SQLiteStmt(state->db,
|
||||||
|
"delete from NARs where ((present = 0 and timestamp < ?) or (present = 1 and timestamp < ?))")
|
||||||
|
.use()
|
||||||
|
(now - ttlNegative)
|
||||||
|
(now - ttlPositive)
|
||||||
|
.exec();
|
||||||
|
|
||||||
|
debug("deleted %d entries from the NAR info disk cache", sqlite3_changes(state->db));
|
||||||
|
|
||||||
|
SQLiteStmt(state->db,
|
||||||
|
"insert or replace into LastPurge(dummy, value) values ('', ?)")
|
||||||
|
.use()(now).exec();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Cache & getCache(State & state, const std::string & uri)
|
Cache & getCache(State & state, const std::string & uri)
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct SQLiteStmt
|
||||||
sqlite3 * db = 0;
|
sqlite3 * db = 0;
|
||||||
sqlite3_stmt * stmt = 0;
|
sqlite3_stmt * stmt = 0;
|
||||||
SQLiteStmt() { }
|
SQLiteStmt() { }
|
||||||
|
SQLiteStmt(sqlite3 * db, const std::string & s) { create(db, s); }
|
||||||
void create(sqlite3 * db, const std::string & s);
|
void create(sqlite3 * db, const std::string & s);
|
||||||
~SQLiteStmt();
|
~SQLiteStmt();
|
||||||
operator sqlite3_stmt * () { return stmt; }
|
operator sqlite3_stmt * () { return stmt; }
|
||||||
|
|
Loading…
Reference in a new issue