Re-implement the WantMassQuery property of binary caches
This commit is contained in:
		
							parent
							
								
									b66ab6cdbc
								
							
						
					
					
						commit
						e222484401
					
				
					 8 changed files with 40 additions and 8 deletions
				
			
		|  | @ -29,8 +29,27 @@ BinaryCacheStore::BinaryCacheStore(const StoreParams & params) | ||||||
| void BinaryCacheStore::init() | void BinaryCacheStore::init() | ||||||
| { | { | ||||||
|     std::string cacheInfoFile = "nix-cache-info"; |     std::string cacheInfoFile = "nix-cache-info"; | ||||||
|     if (!fileExists(cacheInfoFile)) | 
 | ||||||
|  |     auto cacheInfo = getFile(cacheInfoFile); | ||||||
|  |     if (!cacheInfo) { | ||||||
|         upsertFile(cacheInfoFile, "StoreDir: " + settings.nixStore + "\n"); |         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() | void BinaryCacheStore::notImpl() | ||||||
|  |  | ||||||
|  | @ -33,6 +33,9 @@ protected: | ||||||
|        doesn't exist. */ |        doesn't exist. */ | ||||||
|     virtual std::shared_ptr<std::string> getFile(const std::string & path) = 0; |     virtual std::shared_ptr<std::string> getFile(const std::string & path) = 0; | ||||||
| 
 | 
 | ||||||
|  |     bool wantMassQuery_ = false; | ||||||
|  |     int priority = 50; | ||||||
|  | 
 | ||||||
| public: | public: | ||||||
| 
 | 
 | ||||||
|     virtual void init(); |     virtual void init(); | ||||||
|  | @ -78,6 +81,8 @@ public: | ||||||
|         SubstitutablePathInfos & infos) |         SubstitutablePathInfos & infos) | ||||||
|     { } |     { } | ||||||
| 
 | 
 | ||||||
|  |     bool wantMassQuery() { return wantMassQuery_; } | ||||||
|  | 
 | ||||||
|     void addToStore(const ValidPathInfo & info, const std::string & nar, |     void addToStore(const ValidPathInfo & info, const std::string & nar, | ||||||
|         bool repair = false) override; |         bool repair = false) override; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,8 @@ | ||||||
| 
 | 
 | ||||||
| namespace nix { | namespace nix { | ||||||
| 
 | 
 | ||||||
|  | MakeError(UploadToHTTP, Error); | ||||||
|  | 
 | ||||||
| class HttpBinaryCacheStore : public BinaryCacheStore | class HttpBinaryCacheStore : public BinaryCacheStore | ||||||
| { | { | ||||||
| private: | private: | ||||||
|  | @ -38,9 +40,12 @@ public: | ||||||
|     { |     { | ||||||
|         // FIXME: do this lazily?
 |         // FIXME: do this lazily?
 | ||||||
|         if (!diskCache->cacheExists(cacheUri)) { |         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); |                 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 |     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 |     std::shared_ptr<std::string> getFile(const std::string & path) override | ||||||
|  |  | ||||||
|  | @ -788,6 +788,7 @@ PathSet LocalStore::querySubstitutablePaths(const PathSet & paths) | ||||||
| { | { | ||||||
|     PathSet res; |     PathSet res; | ||||||
|     for (auto & sub : getDefaultSubstituters()) { |     for (auto & sub : getDefaultSubstituters()) { | ||||||
|  |         if (!sub->wantMassQuery()) continue; | ||||||
|         for (auto & path : paths) { |         for (auto & path : paths) { | ||||||
|             if (res.count(path)) continue; |             if (res.count(path)) continue; | ||||||
|             debug(format("checking substituter ‘%s’ for path ‘%s’") |             debug(format("checking substituter ‘%s’ for path ‘%s’") | ||||||
|  |  | ||||||
|  | @ -113,13 +113,13 @@ public: | ||||||
|         return i->second; |         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()); |         auto state(_state.lock()); | ||||||
| 
 | 
 | ||||||
|         // FIXME: race
 |         // 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); |         assert(sqlite3_changes(state->db) == 1); | ||||||
|         state->caches[uri] = sqlite3_last_insert_rowid(state->db); |         state->caches[uri] = sqlite3_last_insert_rowid(state->db); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ class NarInfoDiskCache | ||||||
| public: | public: | ||||||
|     typedef enum { oValid, oInvalid, oUnknown } Outcome; |     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; |     virtual bool cacheExists(const std::string & uri) = 0; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -95,7 +95,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore | ||||||
| 
 | 
 | ||||||
|             BinaryCacheStore::init(); |             BinaryCacheStore::init(); | ||||||
| 
 | 
 | ||||||
|             diskCache->createCache(getUri()); |             diskCache->createCache(getUri(), wantMassQuery, priority); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -253,6 +253,8 @@ public: | ||||||
|     virtual void querySubstitutablePathInfos(const PathSet & paths, |     virtual void querySubstitutablePathInfos(const PathSet & paths, | ||||||
|         SubstitutablePathInfos & infos) = 0; |         SubstitutablePathInfos & infos) = 0; | ||||||
| 
 | 
 | ||||||
|  |     virtual bool wantMassQuery() { return false; } | ||||||
|  | 
 | ||||||
|     /* Import a path into the store. */ |     /* Import a path into the store. */ | ||||||
|     virtual void addToStore(const ValidPathInfo & info, const std::string & nar, |     virtual void addToStore(const ValidPathInfo & info, const std::string & nar, | ||||||
|         bool repair = false) = 0; |         bool repair = false) = 0; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue