Re-implement the WantMassQuery property of binary caches

This commit is contained in:
Eelco Dolstra 2016-05-30 13:33:05 +02:00
parent b66ab6cdbc
commit e222484401
8 changed files with 40 additions and 8 deletions

View file

@ -29,8 +29,27 @@ BinaryCacheStore::BinaryCacheStore(const StoreParams & params)
void BinaryCacheStore::init()
{
std::string cacheInfoFile = "nix-cache-info";
if (!fileExists(cacheInfoFile))
auto cacheInfo = getFile(cacheInfoFile);
if (!cacheInfo) {
upsertFile(cacheInfoFile, "StoreDir: " + settings.nixStore + "\n");
} else {
for (auto & line : tokenizeString<Strings>(*cacheInfo, "\n")) {
size_t colon = line.find(':');
if (colon == std::string::npos) continue;
auto name = line.substr(0, colon);
auto value = trim(line.substr(colon + 1, std::string::npos));
if (name == "StoreDir") {
if (value != settings.nixStore)
throw Error(format("binary cache %s is for Nix stores with prefix %s, not %s")
% getUri() % value % settings.nixStore);
} else if (name == "WantMassQuery") {
wantMassQuery_ = value == "1";
} else if (name == "Priority") {
string2Int(value, priority);
}
}
}
}
void BinaryCacheStore::notImpl()

View file

@ -33,6 +33,9 @@ protected:
doesn't exist. */
virtual std::shared_ptr<std::string> getFile(const std::string & path) = 0;
bool wantMassQuery_ = false;
int priority = 50;
public:
virtual void init();
@ -78,6 +81,8 @@ public:
SubstitutablePathInfos & infos)
{ }
bool wantMassQuery() { return wantMassQuery_; }
void addToStore(const ValidPathInfo & info, const std::string & nar,
bool repair = false) override;

View file

@ -5,6 +5,8 @@
namespace nix {
MakeError(UploadToHTTP, Error);
class HttpBinaryCacheStore : public BinaryCacheStore
{
private:
@ -38,9 +40,12 @@ public:
{
// FIXME: do this lazily?
if (!diskCache->cacheExists(cacheUri)) {
if (!fileExists("nix-cache-info"))
try {
BinaryCacheStore::init();
} catch (UploadToHTTP &) {
throw Error(format("%s does not appear to be a binary cache") % cacheUri);
diskCache->createCache(cacheUri);
}
diskCache->createCache(cacheUri, wantMassQuery_, priority);
}
}
@ -66,7 +71,7 @@ protected:
void upsertFile(const std::string & path, const std::string & data) override
{
throw Error("uploading to an HTTP binary cache is not supported");
throw UploadToHTTP("uploading to an HTTP binary cache is not supported");
}
std::shared_ptr<std::string> getFile(const std::string & path) override

View file

@ -788,6 +788,7 @@ PathSet LocalStore::querySubstitutablePaths(const PathSet & paths)
{
PathSet res;
for (auto & sub : getDefaultSubstituters()) {
if (!sub->wantMassQuery()) continue;
for (auto & path : paths) {
if (res.count(path)) continue;
debug(format("checking substituter %s for path %s")

View file

@ -113,13 +113,13 @@ public:
return i->second;
}
void createCache(const std::string & uri) override
void createCache(const std::string & uri, bool wantMassQuery, int priority) override
{
auto state(_state.lock());
// FIXME: race
state->insertCache.use()(uri)(time(0))(settings.nixStore)(1)(0).exec();
state->insertCache.use()(uri)(time(0))(settings.nixStore)(wantMassQuery)(priority).exec();
assert(sqlite3_changes(state->db) == 1);
state->caches[uri] = sqlite3_last_insert_rowid(state->db);
}

View file

@ -10,7 +10,7 @@ class NarInfoDiskCache
public:
typedef enum { oValid, oInvalid, oUnknown } Outcome;
virtual void createCache(const std::string & uri) = 0;
virtual void createCache(const std::string & uri, bool wantMassQuery, int priority) = 0;
virtual bool cacheExists(const std::string & uri) = 0;

View file

@ -95,7 +95,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
BinaryCacheStore::init();
diskCache->createCache(getUri());
diskCache->createCache(getUri(), wantMassQuery, priority);
}
}

View file

@ -253,6 +253,8 @@ public:
virtual void querySubstitutablePathInfos(const PathSet & paths,
SubstitutablePathInfos & infos) = 0;
virtual bool wantMassQuery() { return false; }
/* Import a path into the store. */
virtual void addToStore(const ValidPathInfo & info, const std::string & nar,
bool repair = false) = 0;