From cd4d2705ec6e641ffa3b11dc1aabad22fc38251a Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 2 May 2017 14:18:46 +0200 Subject: [PATCH] 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. --- src/build-remote/build-remote.cc | 1 + src/libstore/legacy-ssh-store.cc | 5 +++++ src/libstore/remote-store.cc | 8 +++++++- src/libstore/remote-store.hh | 2 ++ src/libstore/store-api.hh | 4 ++++ 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/build-remote/build-remote.cc b/src/build-remote/build-remote.cc index 5cd3c518b..8876da6c0 100644 --- a/src/build-remote/build-remote.cc +++ b/src/build-remote/build-remote.cc @@ -167,6 +167,7 @@ int main (int argc, char * * argv) storeParams["ssh-key"] = bestMachine->sshKey; sshStore = openStore(bestMachine->storeUri, storeParams); + sshStore->connect(); storeUri = bestMachine->storeUri; } catch (std::exception & e) { diff --git a/src/libstore/legacy-ssh-store.cc b/src/libstore/legacy-ssh-store.cc index a6479a450..e09932e3d 100644 --- a/src/libstore/legacy-ssh-store.cc +++ b/src/libstore/legacy-ssh-store.cc @@ -262,6 +262,11 @@ struct LegacySSHStore : public Store return readStorePaths(*this, conn->from); } + + void connect() override + { + auto conn(connections->get()); + } }; static RegisterStoreImplementation regStore([]( diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index af59d5110..be8819bbc 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -100,7 +100,7 @@ ref UDSRemoteStore::openConnection() throw Error(format("socket path ‘%1%’ is too long") % socketPath); 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); 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() { try { diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh index 479cf3a79..ed430e4ca 100644 --- a/src/libstore/remote-store.hh +++ b/src/libstore/remote-store.hh @@ -92,6 +92,8 @@ public: PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown, unsigned long long & downloadSize, unsigned long long & narSize) override; + void connect() override; + protected: struct Connection diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh index 8ca3f4b27..b06f5d86a 100644 --- a/src/libstore/store-api.hh +++ b/src/libstore/store-api.hh @@ -582,6 +582,10 @@ public: 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: Stats stats;