forked from lix-project/lix
Re-implement negative binary cache lookup caching
This commit is contained in:
parent
fffacd7c78
commit
74dd603495
|
@ -20,7 +20,7 @@ create table if not exists BinaryCaches (
|
||||||
create table if not exists NARs (
|
create table if not exists NARs (
|
||||||
cache integer not null,
|
cache integer not null,
|
||||||
hashPart text not null,
|
hashPart text not null,
|
||||||
namePart text not null,
|
namePart text,
|
||||||
url text,
|
url text,
|
||||||
compression text,
|
compression text,
|
||||||
fileHash text,
|
fileHash text,
|
||||||
|
@ -31,6 +31,7 @@ create table if not exists NARs (
|
||||||
deriver text,
|
deriver text,
|
||||||
sigs text,
|
sigs text,
|
||||||
timestamp integer not null,
|
timestamp integer not null,
|
||||||
|
present integer not null,
|
||||||
primary key (cache, hashPart),
|
primary key (cache, hashPart),
|
||||||
foreign key (cache) references BinaryCaches(id) on delete cascade
|
foreign key (cache) references BinaryCaches(id) on delete cascade
|
||||||
);
|
);
|
||||||
|
@ -64,7 +65,7 @@ public:
|
||||||
struct State
|
struct State
|
||||||
{
|
{
|
||||||
SQLite db;
|
SQLite db;
|
||||||
SQLiteStmt insertCache, queryCache, insertNAR, queryNAR, insertNARExistence, queryNARExistence;
|
SQLiteStmt insertCache, queryCache, insertNAR, insertMissingNAR, queryNAR;
|
||||||
std::map<std::string, Cache> caches;
|
std::map<std::string, Cache> caches;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -74,7 +75,7 @@ public:
|
||||||
{
|
{
|
||||||
auto state(_state.lock());
|
auto state(_state.lock());
|
||||||
|
|
||||||
Path dbPath = getCacheDir() + "/nix/binary-cache-v4.sqlite";
|
Path dbPath = getCacheDir() + "/nix/binary-cache-v5.sqlite";
|
||||||
createDirs(dirOf(dbPath));
|
createDirs(dirOf(dbPath));
|
||||||
|
|
||||||
if (sqlite3_open_v2(dbPath.c_str(), &state->db.db,
|
if (sqlite3_open_v2(dbPath.c_str(), &state->db.db,
|
||||||
|
@ -101,16 +102,13 @@ public:
|
||||||
|
|
||||||
state->insertNAR.create(state->db,
|
state->insertNAR.create(state->db,
|
||||||
"insert or replace into NARs(cache, hashPart, namePart, url, compression, fileHash, fileSize, narHash, "
|
"insert or replace into NARs(cache, hashPart, namePart, url, compression, fileHash, fileSize, narHash, "
|
||||||
"narSize, refs, deriver, sigs, timestamp) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
"narSize, refs, deriver, sigs, timestamp, present) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)");
|
||||||
|
|
||||||
|
state->insertMissingNAR.create(state->db,
|
||||||
|
"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 = ?");
|
||||||
|
|
||||||
state->insertNARExistence.create(state->db,
|
|
||||||
"insert or replace into NARExistence(cache, storePath, exist, timestamp) values (?, ?, ?, ?)");
|
|
||||||
|
|
||||||
state->queryNARExistence.create(state->db,
|
|
||||||
"select exist, timestamp from NARExistence where cache = ? and storePath = ?");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Cache & getCache(State & state, const std::string & uri)
|
Cache & getCache(State & state, const std::string & uri)
|
||||||
|
@ -165,6 +163,9 @@ public:
|
||||||
// FIXME: check NARExistence
|
// FIXME: check NARExistence
|
||||||
return {oUnknown, 0};
|
return {oUnknown, 0};
|
||||||
|
|
||||||
|
if (!queryNAR.getInt(13))
|
||||||
|
return {oInvalid, 0};
|
||||||
|
|
||||||
auto narInfo = make_ref<NarInfo>();
|
auto narInfo = make_ref<NarInfo>();
|
||||||
|
|
||||||
// FIXME: implement TTL.
|
// FIXME: implement TTL.
|
||||||
|
@ -219,8 +220,10 @@ public:
|
||||||
(time(0)).exec();
|
(time(0)).exec();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// not implemented
|
state->insertMissingNAR.use()
|
||||||
abort();
|
(cache.id)
|
||||||
|
(hashPart)
|
||||||
|
(time(0)).exec();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -265,9 +265,13 @@ bool Store::isValidPath(const Path & storePath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return isValidPathUncached(storePath);
|
bool valid = isValidPathUncached(storePath);
|
||||||
|
|
||||||
// FIXME: insert result into NARExistence table of diskCache.
|
if (diskCache && !valid)
|
||||||
|
// FIXME: handle valid = true case.
|
||||||
|
diskCache->upsertNarInfo(getUri(), hashPart, 0);
|
||||||
|
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -302,7 +306,7 @@ ref<const ValidPathInfo> Store::queryPathInfo(const Path & storePath)
|
||||||
|
|
||||||
auto info = queryPathInfoUncached(storePath);
|
auto info = queryPathInfoUncached(storePath);
|
||||||
|
|
||||||
if (diskCache && info)
|
if (diskCache)
|
||||||
diskCache->upsertNarInfo(getUri(), hashPart, info);
|
diskCache->upsertNarInfo(getUri(), hashPart, info);
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue