build-remote: Fix fallback to other machines when connecting fails
Opening an SSHStore or LegacySSHStore does not actually establish a connection, so the try/catch block here did nothing. Added a Store::connect() method to test whether a connection can be established.
This commit is contained in:
		
							parent
							
								
									1a68710d4d
								
							
						
					
					
						commit
						cd4d2705ec
					
				
					 5 changed files with 19 additions and 1 deletions
				
			
		|  | @ -167,6 +167,7 @@ int main (int argc, char * * argv) | ||||||
|                         storeParams["ssh-key"] = bestMachine->sshKey; |                         storeParams["ssh-key"] = bestMachine->sshKey; | ||||||
| 
 | 
 | ||||||
|                     sshStore = openStore(bestMachine->storeUri, storeParams); |                     sshStore = openStore(bestMachine->storeUri, storeParams); | ||||||
|  |                     sshStore->connect(); | ||||||
|                     storeUri = bestMachine->storeUri; |                     storeUri = bestMachine->storeUri; | ||||||
| 
 | 
 | ||||||
|                 } catch (std::exception & e) { |                 } catch (std::exception & e) { | ||||||
|  |  | ||||||
|  | @ -262,6 +262,11 @@ struct LegacySSHStore : public Store | ||||||
| 
 | 
 | ||||||
|         return readStorePaths<PathSet>(*this, conn->from); |         return readStorePaths<PathSet>(*this, conn->from); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     void connect() override | ||||||
|  |     { | ||||||
|  |         auto conn(connections->get()); | ||||||
|  |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static RegisterStoreImplementation regStore([]( | static RegisterStoreImplementation regStore([]( | ||||||
|  |  | ||||||
|  | @ -100,7 +100,7 @@ ref<RemoteStore::Connection> UDSRemoteStore::openConnection() | ||||||
|         throw Error(format("socket path ‘%1%’ is too long") % socketPath); |         throw Error(format("socket path ‘%1%’ is too long") % socketPath); | ||||||
|     strcpy(addr.sun_path, socketPath.c_str()); |     strcpy(addr.sun_path, socketPath.c_str()); | ||||||
| 
 | 
 | ||||||
|     if (connect(conn->fd.get(), (struct sockaddr *) &addr, sizeof(addr)) == -1) |     if (::connect(conn->fd.get(), (struct sockaddr *) &addr, sizeof(addr)) == -1) | ||||||
|         throw SysError(format("cannot connect to daemon at ‘%1%’") % socketPath); |         throw SysError(format("cannot connect to daemon at ‘%1%’") % socketPath); | ||||||
| 
 | 
 | ||||||
|     conn->from.fd = conn->fd.get(); |     conn->from.fd = conn->fd.get(); | ||||||
|  | @ -613,6 +613,12 @@ void RemoteStore::queryMissing(const PathSet & targets, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | void RemoteStore::connect() | ||||||
|  | { | ||||||
|  |     auto conn(connections->get()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| RemoteStore::Connection::~Connection() | RemoteStore::Connection::~Connection() | ||||||
| { | { | ||||||
|     try { |     try { | ||||||
|  |  | ||||||
|  | @ -92,6 +92,8 @@ public: | ||||||
|         PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown, |         PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown, | ||||||
|         unsigned long long & downloadSize, unsigned long long & narSize) override; |         unsigned long long & downloadSize, unsigned long long & narSize) override; | ||||||
| 
 | 
 | ||||||
|  |     void connect() override; | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 
 | 
 | ||||||
|     struct Connection |     struct Connection | ||||||
|  |  | ||||||
|  | @ -582,6 +582,10 @@ public: | ||||||
|         state.lock()->pathInfoCache.clear(); |         state.lock()->pathInfoCache.clear(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /* Establish a connection to the store, for store types that have
 | ||||||
|  |        a notion of connection. Otherwise this is a no-op. */ | ||||||
|  |     virtual void connect() { }; | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 
 | 
 | ||||||
|     Stats stats; |     Stats stats; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue