aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-01 15:15:21 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-01 16:24:17 +0200
commitcf198952d02aae5585e9bb895577b5b4e7b25707 (patch)
tree2161ec8760bf9d2ca64c14c1440e7db31bb1d1be /src
parent7850d3d27910c30232dd09dd86ee8afdaad26b90 (diff)
HttpBinaryCacheStore: Fix caching of WantMassQuery
Also, test HttpBinaryCacheStore in addition to LocalBinaryCacheStore.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/http-binary-cache-store.cc6
-rw-r--r--src/libstore/local-binary-cache-store.cc10
-rw-r--r--src/libstore/nar-info-disk-cache.cc24
-rw-r--r--src/libstore/nar-info-disk-cache.hh3
-rw-r--r--src/libstore/s3-binary-cache-store.cc2
5 files changed, 25 insertions, 20 deletions
diff --git a/src/libstore/http-binary-cache-store.cc b/src/libstore/http-binary-cache-store.cc
index 9587ac547..da80b636c 100644
--- a/src/libstore/http-binary-cache-store.cc
+++ b/src/libstore/http-binary-cache-store.cc
@@ -39,7 +39,7 @@ public:
void init() override
{
// FIXME: do this lazily?
- if (!diskCache->cacheExists(cacheUri)) {
+ if (!diskCache->cacheExists(cacheUri, wantMassQuery_, priority)) {
try {
BinaryCacheStore::init();
} catch (UploadToHTTP &) {
@@ -95,7 +95,9 @@ static RegisterStoreImplementation regStore([](
-> std::shared_ptr<Store>
{
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);
store->init();
return store;
diff --git a/src/libstore/local-binary-cache-store.cc b/src/libstore/local-binary-cache-store.cc
index bdc80cf90..91d2650fe 100644
--- a/src/libstore/local-binary-cache-store.cc
+++ b/src/libstore/local-binary-cache-store.cc
@@ -17,9 +17,6 @@ public:
: BinaryCacheStore(params)
, binaryCacheDir(binaryCacheDir)
{
- /* For testing the NAR info cache. */
- if (getEnv("_NIX_CACHE_FILE_URLS") == "1")
- diskCache = getNarInfoDiskCache();
}
void init() override;
@@ -57,9 +54,6 @@ void LocalBinaryCacheStore::init()
{
createDirs(binaryCacheDir + "/nar");
BinaryCacheStore::init();
-
- if (diskCache && !diskCache->cacheExists(getUri()))
- diskCache->createCache(getUri(), storeDir, wantMassQuery_, priority);
}
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)
-> 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));
store->init();
return store;
diff --git a/src/libstore/nar-info-disk-cache.cc b/src/libstore/nar-info-disk-cache.cc
index b05f2661e..0751dda19 100644
--- a/src/libstore/nar-info-disk-cache.cc
+++ b/src/libstore/nar-info-disk-cache.cc
@@ -57,6 +57,8 @@ public:
{
int id;
Path storeDir;
+ bool wantMassQuery;
+ int priority;
};
struct State
@@ -126,24 +128,28 @@ public:
state->insertCache.use()(uri)(time(0))(storeDir)(wantMassQuery)(priority).exec();
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 i = state->caches.find(uri);
- if (i != state->caches.end()) return true;
+ if (i == state->caches.end()) {
+ auto queryCache(state->queryCache.use()(uri));
+ if (!queryCache.next()) return false;
+ state->caches.emplace(uri,
+ Cache{(int) queryCache.getInt(0), queryCache.getStr(1), queryCache.getInt(2), (int) queryCache.getInt(3)});
+ }
- auto queryCache(state->queryCache.use()(uri));
+ auto & cache(getCache(*state, uri));
- if (queryCache.next()) {
- state->caches[uri] = Cache{(int) queryCache.getInt(0), queryCache.getStr(1)};
- return true;
- }
+ wantMassQuery = cache.wantMassQuery;
+ priority = cache.priority;
- return false;
+ return true;
}
std::pair<Outcome, std::shared_ptr<NarInfo>> lookupNarInfo(
diff --git a/src/libstore/nar-info-disk-cache.hh b/src/libstore/nar-info-disk-cache.hh
index f86d720a9..88d909732 100644
--- a/src/libstore/nar-info-disk-cache.hh
+++ b/src/libstore/nar-info-disk-cache.hh
@@ -13,7 +13,8 @@ public:
virtual void createCache(const std::string & uri, const Path & storeDir,
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(
const std::string & uri, const std::string & hashPart) = 0;
diff --git a/src/libstore/s3-binary-cache-store.cc b/src/libstore/s3-binary-cache-store.cc
index 33cc9659a..ed95620bb 100644
--- a/src/libstore/s3-binary-cache-store.cc
+++ b/src/libstore/s3-binary-cache-store.cc
@@ -71,7 +71,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
void init() override
{
- if (!diskCache->cacheExists(getUri())) {
+ if (!diskCache->cacheExists(getUri(), wantMassQuery_, priority)) {
/* Create the bucket if it doesn't already exists. */
// FIXME: HeadBucket would be more appropriate, but doesn't return