Factor out the unix domain socket-specific code from RemoteStore
This commit is contained in:
		
							parent
							
								
									7d4ccd9b17
								
							
						
					
					
						commit
						0f39633290
					
				
					 5 changed files with 69 additions and 36 deletions
				
			
		|  | @ -37,7 +37,8 @@ namespace nix { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| LocalStore::LocalStore(const Params & params) | LocalStore::LocalStore(const Params & params) | ||||||
|     : LocalFSStore(params) |     : Store(params) | ||||||
|  |     , LocalFSStore(params) | ||||||
|     , realStoreDir(get(params, "real", rootDir != "" ? rootDir + "/nix/store" : storeDir)) |     , realStoreDir(get(params, "real", rootDir != "" ? rootDir + "/nix/store" : storeDir)) | ||||||
|     , dbDir(stateDir + "/db") |     , dbDir(stateDir + "/db") | ||||||
|     , linksDir(realStoreDir + "/.links") |     , linksDir(realStoreDir + "/.links") | ||||||
|  |  | ||||||
|  | @ -38,9 +38,9 @@ template<class T> T readStorePaths(Store & store, Source & from) | ||||||
| 
 | 
 | ||||||
| template PathSet readStorePaths(Store & store, Source & from); | template PathSet readStorePaths(Store & store, Source & from); | ||||||
| 
 | 
 | ||||||
| 
 | /* TODO: Separate these store impls into different files, give them better names */ | ||||||
| RemoteStore::RemoteStore(const Params & params, size_t maxConnections) | RemoteStore::RemoteStore(const Params & params, size_t maxConnections) | ||||||
|     : LocalFSStore(params) |     : Store(params) | ||||||
|     , connections(make_ref<Pool<Connection>>( |     , connections(make_ref<Pool<Connection>>( | ||||||
|             maxConnections, |             maxConnections, | ||||||
|             [this]() { return openConnection(); }, |             [this]() { return openConnection(); }, | ||||||
|  | @ -50,13 +50,21 @@ RemoteStore::RemoteStore(const Params & params, size_t maxConnections) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| std::string RemoteStore::getUri() | UDSRemoteStore::UDSRemoteStore(const Params & params, size_t maxConnections) | ||||||
|  |     : Store(params) | ||||||
|  |     , LocalFSStore(params) | ||||||
|  |     , RemoteStore(params, maxConnections) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | std::string UDSRemoteStore::getUri() | ||||||
| { | { | ||||||
|     return "daemon"; |     return "daemon"; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ref<RemoteStore::Connection> RemoteStore::openConnection() | ref<RemoteStore::Connection> UDSRemoteStore::openConnection() | ||||||
| { | { | ||||||
|     auto conn = make_ref<Connection>(); |     auto conn = make_ref<Connection>(); | ||||||
| 
 | 
 | ||||||
|  | @ -84,46 +92,52 @@ ref<RemoteStore::Connection> RemoteStore::openConnection() | ||||||
|     conn->from.fd = conn->fd.get(); |     conn->from.fd = conn->fd.get(); | ||||||
|     conn->to.fd = conn->fd.get(); |     conn->to.fd = conn->fd.get(); | ||||||
| 
 | 
 | ||||||
|  |     initConnection(*conn); | ||||||
|  | 
 | ||||||
|  |     return conn; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void RemoteStore::initConnection(Connection & conn) | ||||||
|  | { | ||||||
|     /* Send the magic greeting, check for the reply. */ |     /* Send the magic greeting, check for the reply. */ | ||||||
|     try { |     try { | ||||||
|         conn->to << WORKER_MAGIC_1; |         conn.to << WORKER_MAGIC_1; | ||||||
|         conn->to.flush(); |         conn.to.flush(); | ||||||
|         unsigned int magic = readInt(conn->from); |         unsigned int magic = readInt(conn.from); | ||||||
|         if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch"); |         if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch"); | ||||||
| 
 | 
 | ||||||
|         conn->daemonVersion = readInt(conn->from); |         conn.daemonVersion = readInt(conn.from); | ||||||
|         if (GET_PROTOCOL_MAJOR(conn->daemonVersion) != GET_PROTOCOL_MAJOR(PROTOCOL_VERSION)) |         if (GET_PROTOCOL_MAJOR(conn.daemonVersion) != GET_PROTOCOL_MAJOR(PROTOCOL_VERSION)) | ||||||
|             throw Error("Nix daemon protocol version not supported"); |             throw Error("Nix daemon protocol version not supported"); | ||||||
|         if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 10) |         if (GET_PROTOCOL_MINOR(conn.daemonVersion) < 10) | ||||||
|             throw Error("the Nix daemon version is too old"); |             throw Error("the Nix daemon version is too old"); | ||||||
|         conn->to << PROTOCOL_VERSION; |         conn.to << PROTOCOL_VERSION; | ||||||
| 
 | 
 | ||||||
|         if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 14) { |         if (GET_PROTOCOL_MINOR(conn.daemonVersion) >= 14) { | ||||||
|             int cpu = settings.lockCPU ? lockToCurrentCPU() : -1; |             int cpu = settings.lockCPU ? lockToCurrentCPU() : -1; | ||||||
|             if (cpu != -1) |             if (cpu != -1) | ||||||
|                 conn->to << 1 << cpu; |                 conn.to << 1 << cpu; | ||||||
|             else |             else | ||||||
|                 conn->to << 0; |                 conn.to << 0; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 11) |         if (GET_PROTOCOL_MINOR(conn.daemonVersion) >= 11) | ||||||
|             conn->to << false; |             conn.to << false; | ||||||
| 
 | 
 | ||||||
|         conn->processStderr(); |         conn.processStderr(); | ||||||
|     } |     } | ||||||
|     catch (Error & e) { |     catch (Error & e) { | ||||||
|         throw Error(format("cannot start daemon worker: %1%") % e.msg()); |         throw Error(format("cannot start daemon worker: %1%") % e.msg()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     setOptions(conn); |     setOptions(conn); | ||||||
| 
 |  | ||||||
|     return conn; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void RemoteStore::setOptions(ref<Connection> conn) | void RemoteStore::setOptions(Connection & conn) | ||||||
| { | { | ||||||
|     conn->to << wopSetOptions |     conn.to << wopSetOptions | ||||||
|        << settings.keepFailed |        << settings.keepFailed | ||||||
|        << settings.keepGoing |        << settings.keepGoing | ||||||
|        << settings.tryFallback |        << settings.tryFallback | ||||||
|  | @ -137,16 +151,16 @@ void RemoteStore::setOptions(ref<Connection> conn) | ||||||
|        << settings.buildCores |        << settings.buildCores | ||||||
|        << settings.useSubstitutes; |        << settings.useSubstitutes; | ||||||
| 
 | 
 | ||||||
|     if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 12) { |     if (GET_PROTOCOL_MINOR(conn.daemonVersion) >= 12) { | ||||||
|         Settings::SettingsMap overrides = settings.getOverrides(); |         Settings::SettingsMap overrides = settings.getOverrides(); | ||||||
|         if (overrides["ssh-auth-sock"] == "") |         if (overrides["ssh-auth-sock"] == "") | ||||||
|             overrides["ssh-auth-sock"] = getEnv("SSH_AUTH_SOCK"); |             overrides["ssh-auth-sock"] = getEnv("SSH_AUTH_SOCK"); | ||||||
|         conn->to << overrides.size(); |         conn.to << overrides.size(); | ||||||
|         for (auto & i : overrides) |         for (auto & i : overrides) | ||||||
|             conn->to << i.first << i.second; |             conn.to << i.first << i.second; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     conn->processStderr(); |     conn.processStderr(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -528,7 +542,6 @@ RemoteStore::Connection::~Connection() | ||||||
| { | { | ||||||
|     try { |     try { | ||||||
|         to.flush(); |         to.flush(); | ||||||
|         fd = -1; |  | ||||||
|     } catch (...) { |     } catch (...) { | ||||||
|         ignoreException(); |         ignoreException(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ template<typename T> class Pool; | ||||||
| 
 | 
 | ||||||
| /* FIXME: RemoteStore is a misnomer - should be something like
 | /* FIXME: RemoteStore is a misnomer - should be something like
 | ||||||
|    DaemonStore. */ |    DaemonStore. */ | ||||||
| class RemoteStore : public LocalFSStore | class RemoteStore : public virtual Store | ||||||
| { | { | ||||||
| public: | public: | ||||||
| 
 | 
 | ||||||
|  | @ -26,8 +26,6 @@ public: | ||||||
| 
 | 
 | ||||||
|     /* Implementations of abstract store API methods. */ |     /* Implementations of abstract store API methods. */ | ||||||
| 
 | 
 | ||||||
|     std::string getUri() override; |  | ||||||
| 
 |  | ||||||
|     bool isValidPathUncached(const Path & path) override; |     bool isValidPathUncached(const Path & path) override; | ||||||
| 
 | 
 | ||||||
|     PathSet queryValidPaths(const PathSet & paths) override; |     PathSet queryValidPaths(const PathSet & paths) override; | ||||||
|  | @ -84,11 +82,10 @@ public: | ||||||
| 
 | 
 | ||||||
|     void addSignatures(const Path & storePath, const StringSet & sigs) override; |     void addSignatures(const Path & storePath, const StringSet & sigs) override; | ||||||
| 
 | 
 | ||||||
| private: | protected: | ||||||
| 
 | 
 | ||||||
|     struct Connection |     struct Connection | ||||||
|     { |     { | ||||||
|         AutoCloseFD fd; |  | ||||||
|         FdSink to; |         FdSink to; | ||||||
|         FdSource from; |         FdSource from; | ||||||
|         unsigned int daemonVersion; |         unsigned int daemonVersion; | ||||||
|  | @ -98,11 +95,33 @@ private: | ||||||
|         void processStderr(Sink * sink = 0, Source * source = 0); |         void processStderr(Sink * sink = 0, Source * source = 0); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     virtual ref<Connection> openConnection() = 0; | ||||||
|  | 
 | ||||||
|  |     void setOptions(Connection & conn); | ||||||
|  | 
 | ||||||
|  |     void initConnection(Connection & conn); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|     ref<Pool<Connection>> connections; |     ref<Pool<Connection>> connections; | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
|     ref<Connection> openConnection(); | class UDSRemoteStore : public LocalFSStore, public RemoteStore | ||||||
|  | { | ||||||
|  | public: | ||||||
| 
 | 
 | ||||||
|     void setOptions(ref<Connection> conn); |     UDSRemoteStore(const Params & params, size_t maxConnections = std::numeric_limits<size_t>::max()); | ||||||
|  | 
 | ||||||
|  |     std::string getUri() override; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|  |     struct Connection : RemoteStore::Connection | ||||||
|  |     { | ||||||
|  |         AutoCloseFD fd; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     ref<RemoteStore::Connection> openConnection() override; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -554,7 +554,7 @@ static RegisterStoreImplementation regStore([]( | ||||||
| { | { | ||||||
|     switch (getStoreType(uri, get(params, "state", settings.nixStateDir))) { |     switch (getStoreType(uri, get(params, "state", settings.nixStateDir))) { | ||||||
|         case tDaemon: |         case tDaemon: | ||||||
|             return std::shared_ptr<Store>(std::make_shared<RemoteStore>(params)); |             return std::shared_ptr<Store>(std::make_shared<UDSRemoteStore>(params)); | ||||||
|         case tLocal: |         case tLocal: | ||||||
|             return std::shared_ptr<Store>(std::make_shared<LocalStore>(params)); |             return std::shared_ptr<Store>(std::make_shared<LocalStore>(params)); | ||||||
|         default: |         default: | ||||||
|  |  | ||||||
|  | @ -526,7 +526,7 @@ protected: | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class LocalFSStore : public Store | class LocalFSStore : public virtual Store | ||||||
| { | { | ||||||
| public: | public: | ||||||
|     const Path rootDir; |     const Path rootDir; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue