Cache connection failures

This commit is contained in:
Eelco Dolstra 2017-03-03 19:35:34 +01:00
parent 8490ee37a6
commit d1158bb816
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
2 changed files with 18 additions and 1 deletions

View file

@ -44,13 +44,26 @@ RemoteStore::RemoteStore(const Params & params)
: Store(params) : Store(params)
, connections(make_ref<Pool<Connection>>( , connections(make_ref<Pool<Connection>>(
std::max(1, std::stoi(get(params, "max-connections", "1"))), std::max(1, std::stoi(get(params, "max-connections", "1"))),
[this]() { return openConnection(); }, [this]() { return openConnectionWrapper(); },
[](const ref<Connection> & r) { return r->to.good() && r->from.good(); } [](const ref<Connection> & r) { return r->to.good() && r->from.good(); }
)) ))
{ {
} }
ref<RemoteStore::Connection> RemoteStore::openConnectionWrapper()
{
if (failed)
throw Error("opening a connection to remote store %s previously failed", getUri());
try {
return openConnection();
} catch (...) {
failed = true;
throw;
}
}
UDSRemoteStore::UDSRemoteStore(const Params & params) UDSRemoteStore::UDSRemoteStore(const Params & params)
: Store(params) : Store(params)
, LocalFSStore(params) , LocalFSStore(params)

View file

@ -98,6 +98,8 @@ protected:
void processStderr(Sink * sink = 0, Source * source = 0); void processStderr(Sink * sink = 0, Source * source = 0);
}; };
ref<Connection> openConnectionWrapper();
virtual ref<Connection> openConnection() = 0; virtual ref<Connection> openConnection() = 0;
void initConnection(Connection & conn); void initConnection(Connection & conn);
@ -106,6 +108,8 @@ protected:
private: private:
std::atomic_bool failed{false};
void setOptions(Connection & conn); void setOptions(Connection & conn);
}; };