about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-01T13·15+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-06-01T14·24+0200
commitcf198952d02aae5585e9bb895577b5b4e7b25707 (patch)
tree2161ec8760bf9d2ca64c14c1440e7db31bb1d1be
parent7850d3d27910c30232dd09dd86ee8afdaad26b90 (diff)
HttpBinaryCacheStore: Fix caching of WantMassQuery
Also, test HttpBinaryCacheStore in addition to LocalBinaryCacheStore.
-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
-rw-r--r--tests/binary-cache.sh52
6 files changed, 59 insertions, 38 deletions
diff --git a/src/libstore/http-binary-cache-store.cc b/src/libstore/http-binary-cache-store.cc
index 9587ac5474fb..da80b636c76c 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 bdc80cf90fee..91d2650fe124 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 b05f2661ea8d..0751dda19286 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 f86d720a9586..88d909732dbc 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 33cc9659a0cd..ed95620bbd7c 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
diff --git a/tests/binary-cache.sh b/tests/binary-cache.sh
index 48bc62d311de..96cab6ad4269 100644
--- a/tests/binary-cache.sh
+++ b/tests/binary-cache.sh
@@ -9,34 +9,50 @@ outPath=$(nix-build dependencies.nix --no-out-link)
 nix-push --dest $cacheDir $outPath
 
 
-# By default, a binary cache doesn't support "nix-env -qas", but does
-# support installation.
-clearStore
-clearCacheCache
+basicTests() {
 
-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.
-clearStore
-clearCacheCache
-echo "WantMassQuery: 1" >> $cacheDir/nix-cache-info
+    # But with the right configuration, "nix-env -qas" should also work.
+    clearStore
+    clearCacheCache
+    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"
+
+    x=$(nix-env -f dependencies.nix -qas \* --prebuilt-only)
+    [ -z "$x" ]
+
+    nix-store --option binary-caches "file://$cacheDir" -r $outPath
+
+    nix-store --check-validity $outPath
+    nix-store -qR $outPath | grep input-2
+
+    echo "WantMassQuery: 0" >> $cacheDir/nix-cache-info
+}
+
+
+# Test LocalBinaryCacheStore.
+basicTests
 
-nix-env --option binary-caches "file://$cacheDir" -f dependencies.nix -qas \* | grep -- "--S"
 
-x=$(nix-env -f dependencies.nix -qas \* --prebuilt-only)
-[ -z "$x" ]
+# Test HttpBinaryCacheStore.
+export _NIX_FORCE_HTTP_BINARY_CACHE_STORE=1
+basicTests
 
-nix-store --option binary-caches "file://$cacheDir" -r $outPath
 
-nix-store --check-validity $outPath
-nix-store -qR $outPath | grep input-2
+unset _NIX_FORCE_HTTP_BINARY_CACHE_STORE
 
 
 # Test whether Nix notices if the NAR doesn't match the hash in the NAR info.