forked from lix-project/lix
HttpBinaryCacheStore: Fix caching of WantMassQuery
Also, test HttpBinaryCacheStore in addition to LocalBinaryCacheStore.
This commit is contained in:
parent
7850d3d279
commit
cf198952d0
|
@ -39,7 +39,7 @@ public:
|
||||||
void init() override
|
void init() override
|
||||||
{
|
{
|
||||||
// FIXME: do this lazily?
|
// FIXME: do this lazily?
|
||||||
if (!diskCache->cacheExists(cacheUri)) {
|
if (!diskCache->cacheExists(cacheUri, wantMassQuery_, priority)) {
|
||||||
try {
|
try {
|
||||||
BinaryCacheStore::init();
|
BinaryCacheStore::init();
|
||||||
} catch (UploadToHTTP &) {
|
} catch (UploadToHTTP &) {
|
||||||
|
@ -95,7 +95,9 @@ static RegisterStoreImplementation regStore([](
|
||||||
-> std::shared_ptr<Store>
|
-> std::shared_ptr<Store>
|
||||||
{
|
{
|
||||||
if (std::string(uri, 0, 7) != "http://" &&
|
if (std::string(uri, 0, 7) != "http://" &&
|
||||||
std::string(uri, 0, 8) != "https://") return 0;
|
std::string(uri, 0, 8) != "https://" &&
|
||||||
|
(getEnv("_NIX_FORCE_HTTP_BINARY_CACHE_STORE") != "1" || std::string(uri, 0, 7) != "file://")
|
||||||
|
) return 0;
|
||||||
auto store = std::make_shared<HttpBinaryCacheStore>(params, uri);
|
auto store = std::make_shared<HttpBinaryCacheStore>(params, uri);
|
||||||
store->init();
|
store->init();
|
||||||
return store;
|
return store;
|
||||||
|
|
|
@ -17,9 +17,6 @@ public:
|
||||||
: BinaryCacheStore(params)
|
: BinaryCacheStore(params)
|
||||||
, binaryCacheDir(binaryCacheDir)
|
, binaryCacheDir(binaryCacheDir)
|
||||||
{
|
{
|
||||||
/* For testing the NAR info cache. */
|
|
||||||
if (getEnv("_NIX_CACHE_FILE_URLS") == "1")
|
|
||||||
diskCache = getNarInfoDiskCache();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init() override;
|
void init() override;
|
||||||
|
@ -57,9 +54,6 @@ void LocalBinaryCacheStore::init()
|
||||||
{
|
{
|
||||||
createDirs(binaryCacheDir + "/nar");
|
createDirs(binaryCacheDir + "/nar");
|
||||||
BinaryCacheStore::init();
|
BinaryCacheStore::init();
|
||||||
|
|
||||||
if (diskCache && !diskCache->cacheExists(getUri()))
|
|
||||||
diskCache->createCache(getUri(), storeDir, wantMassQuery_, priority);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void atomicWrite(const Path & path, const std::string & s)
|
static void atomicWrite(const Path & path, const std::string & s)
|
||||||
|
@ -96,7 +90,9 @@ static RegisterStoreImplementation regStore([](
|
||||||
const std::string & uri, const Store::Params & params)
|
const std::string & uri, const Store::Params & params)
|
||||||
-> std::shared_ptr<Store>
|
-> std::shared_ptr<Store>
|
||||||
{
|
{
|
||||||
if (std::string(uri, 0, 7) != "file://") return 0;
|
if (getEnv("_NIX_FORCE_HTTP_BINARY_CACHE_STORE") == "1" ||
|
||||||
|
std::string(uri, 0, 7) != "file://")
|
||||||
|
return 0;
|
||||||
auto store = std::make_shared<LocalBinaryCacheStore>(params, std::string(uri, 7));
|
auto store = std::make_shared<LocalBinaryCacheStore>(params, std::string(uri, 7));
|
||||||
store->init();
|
store->init();
|
||||||
return store;
|
return store;
|
||||||
|
|
|
@ -57,6 +57,8 @@ public:
|
||||||
{
|
{
|
||||||
int id;
|
int id;
|
||||||
Path storeDir;
|
Path storeDir;
|
||||||
|
bool wantMassQuery;
|
||||||
|
int priority;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct State
|
struct State
|
||||||
|
@ -126,24 +128,28 @@ public:
|
||||||
|
|
||||||
state->insertCache.use()(uri)(time(0))(storeDir)(wantMassQuery)(priority).exec();
|
state->insertCache.use()(uri)(time(0))(storeDir)(wantMassQuery)(priority).exec();
|
||||||
assert(sqlite3_changes(state->db) == 1);
|
assert(sqlite3_changes(state->db) == 1);
|
||||||
state->caches[uri] = Cache{(int) sqlite3_last_insert_rowid(state->db), storeDir};
|
state->caches[uri] = Cache{(int) sqlite3_last_insert_rowid(state->db), storeDir, wantMassQuery, priority};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cacheExists(const std::string & uri) override
|
bool cacheExists(const std::string & uri,
|
||||||
|
bool & wantMassQuery, int & priority) override
|
||||||
{
|
{
|
||||||
auto state(_state.lock());
|
auto state(_state.lock());
|
||||||
|
|
||||||
auto i = state->caches.find(uri);
|
auto i = state->caches.find(uri);
|
||||||
if (i != state->caches.end()) return true;
|
if (i == state->caches.end()) {
|
||||||
|
|
||||||
auto queryCache(state->queryCache.use()(uri));
|
auto queryCache(state->queryCache.use()(uri));
|
||||||
|
if (!queryCache.next()) return false;
|
||||||
if (queryCache.next()) {
|
state->caches.emplace(uri,
|
||||||
state->caches[uri] = Cache{(int) queryCache.getInt(0), queryCache.getStr(1)};
|
Cache{(int) queryCache.getInt(0), queryCache.getStr(1), queryCache.getInt(2), (int) queryCache.getInt(3)});
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
auto & cache(getCache(*state, uri));
|
||||||
|
|
||||||
|
wantMassQuery = cache.wantMassQuery;
|
||||||
|
priority = cache.priority;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<Outcome, std::shared_ptr<NarInfo>> lookupNarInfo(
|
std::pair<Outcome, std::shared_ptr<NarInfo>> lookupNarInfo(
|
||||||
|
|
|
@ -13,7 +13,8 @@ public:
|
||||||
virtual void createCache(const std::string & uri, const Path & storeDir,
|
virtual void createCache(const std::string & uri, const Path & storeDir,
|
||||||
bool wantMassQuery, int priority) = 0;
|
bool wantMassQuery, int priority) = 0;
|
||||||
|
|
||||||
virtual bool cacheExists(const std::string & uri) = 0;
|
virtual bool cacheExists(const std::string & uri,
|
||||||
|
bool & wantMassQuery, int & priority) = 0;
|
||||||
|
|
||||||
virtual std::pair<Outcome, std::shared_ptr<NarInfo>> lookupNarInfo(
|
virtual std::pair<Outcome, std::shared_ptr<NarInfo>> lookupNarInfo(
|
||||||
const std::string & uri, const std::string & hashPart) = 0;
|
const std::string & uri, const std::string & hashPart) = 0;
|
||||||
|
|
|
@ -71,7 +71,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
||||||
|
|
||||||
void init() override
|
void init() override
|
||||||
{
|
{
|
||||||
if (!diskCache->cacheExists(getUri())) {
|
if (!diskCache->cacheExists(getUri(), wantMassQuery_, priority)) {
|
||||||
|
|
||||||
/* Create the bucket if it doesn't already exists. */
|
/* Create the bucket if it doesn't already exists. */
|
||||||
// FIXME: HeadBucket would be more appropriate, but doesn't return
|
// FIXME: HeadBucket would be more appropriate, but doesn't return
|
||||||
|
|
|
@ -9,34 +9,50 @@ outPath=$(nix-build dependencies.nix --no-out-link)
|
||||||
nix-push --dest $cacheDir $outPath
|
nix-push --dest $cacheDir $outPath
|
||||||
|
|
||||||
|
|
||||||
# By default, a binary cache doesn't support "nix-env -qas", but does
|
basicTests() {
|
||||||
# support installation.
|
|
||||||
clearStore
|
|
||||||
clearCacheCache
|
|
||||||
|
|
||||||
export _NIX_CACHE_FILE_URLS=1
|
# By default, a binary cache doesn't support "nix-env -qas", but does
|
||||||
|
# support installation.
|
||||||
|
clearStore
|
||||||
|
clearCacheCache
|
||||||
|
|
||||||
nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "---"
|
nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "---"
|
||||||
|
|
||||||
nix-store --option binary-caches "file://$cacheDir" -r $outPath
|
nix-store --option binary-caches "file://$cacheDir" -r $outPath
|
||||||
|
|
||||||
[ -x $outPath/program ]
|
[ -x $outPath/program ]
|
||||||
|
|
||||||
|
|
||||||
# But with the right configuration, "nix-env -qas" should also work.
|
# But with the right configuration, "nix-env -qas" should also work.
|
||||||
clearStore
|
clearStore
|
||||||
clearCacheCache
|
clearCacheCache
|
||||||
echo "WantMassQuery: 1" >> $cacheDir/nix-cache-info
|
echo "WantMassQuery: 1" >> $cacheDir/nix-cache-info
|
||||||
|
|
||||||
nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "--S"
|
nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "--S"
|
||||||
|
nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "--S"
|
||||||
|
|
||||||
x=$(nix-env -f dependencies.nix -qas \* --prebuilt-only)
|
x=$(nix-env -f dependencies.nix -qas \* --prebuilt-only)
|
||||||
[ -z "$x" ]
|
[ -z "$x" ]
|
||||||
|
|
||||||
nix-store --option binary-caches "file://$cacheDir" -r $outPath
|
nix-store --option binary-caches "file://$cacheDir" -r $outPath
|
||||||
|
|
||||||
nix-store --check-validity $outPath
|
nix-store --check-validity $outPath
|
||||||
nix-store -qR $outPath | grep input-2
|
nix-store -qR $outPath | grep input-2
|
||||||
|
|
||||||
|
echo "WantMassQuery: 0" >> $cacheDir/nix-cache-info
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Test LocalBinaryCacheStore.
|
||||||
|
basicTests
|
||||||
|
|
||||||
|
|
||||||
|
# Test HttpBinaryCacheStore.
|
||||||
|
export _NIX_FORCE_HTTP_BINARY_CACHE_STORE=1
|
||||||
|
basicTests
|
||||||
|
|
||||||
|
|
||||||
|
unset _NIX_FORCE_HTTP_BINARY_CACHE_STORE
|
||||||
|
|
||||||
|
|
||||||
# Test whether Nix notices if the NAR doesn't match the hash in the NAR info.
|
# Test whether Nix notices if the NAR doesn't match the hash in the NAR info.
|
||||||
|
|
Loading…
Reference in a new issue