summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ConnectionFactory.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2016-05-02 08:28:01 +0200
committerBenoit Foucher <benoit@zeroc.com>2016-05-02 08:28:01 +0200
commit0760fea585122ad26bc7c18941fc67eb187291b0 (patch)
treecfacec796c5026bde0ca35bdecc3474ae78cdfef /cpp/src/Ice/ConnectionFactory.cpp
parentFixed bug where connection to SOCKs/HTTP proxies could hang under certain con... (diff)
downloadice-0760fea585122ad26bc7c18941fc67eb187291b0.tar.bz2
ice-0760fea585122ad26bc7c18941fc67eb187291b0.tar.xz
ice-0760fea585122ad26bc7c18941fc67eb187291b0.zip
Fix to no longer recursively try endpoints on connection establishment
Diffstat (limited to 'cpp/src/Ice/ConnectionFactory.cpp')
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp99
1 files changed, 57 insertions, 42 deletions
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp
index d6a5a22e877..f9f329b3c41 100644
--- a/cpp/src/Ice/ConnectionFactory.cpp
+++ b/cpp/src/Ice/ConnectionFactory.cpp
@@ -835,26 +835,10 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailed(c
const LocalException& ex)
{
assert(_iter != _connectors.end());
-
- if(_observer)
- {
- _observer->failed(ex.ice_name());
- _observer->detach();
- }
-
- _factory->handleConnectionException(ex, _hasMore || _iter != _connectors.end() - 1);
- if(dynamic_cast<const Ice::CommunicatorDestroyedException*>(&ex)) // No need to continue.
- {
- _factory->finishGetConnection(_connectors, ex, this);
- }
- else if(++_iter != _connectors.end()) // Try the next connector.
+ if(connectionStartFailedImpl(ex))
{
nextConnector();
}
- else
- {
- _factory->finishGetConnection(_connectors, ex, this);
- }
}
//
@@ -979,40 +963,46 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::getConnection()
void
IceInternal::OutgoingConnectionFactory::ConnectCallback::nextConnector()
{
- Ice::ConnectionIPtr connection;
- try
+ while(true)
{
-
- const CommunicatorObserverPtr& obsv = _factory->_instance->initializationData().observer;
- if(obsv)
+ try
{
- _observer = obsv->getConnectionEstablishmentObserver(_iter->endpoint, _iter->connector->toString());
- if(_observer)
+ const CommunicatorObserverPtr& obsv = _factory->_instance->initializationData().observer;
+ if(obsv)
{
- _observer->attach();
+ _observer = obsv->getConnectionEstablishmentObserver(_iter->endpoint, _iter->connector->toString());
+ if(_observer)
+ {
+ _observer->attach();
+ }
}
- }
- assert(_iter != _connectors.end());
+ assert(_iter != _connectors.end());
- if(_instance->traceLevels()->network >= 2)
- {
- Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
- out << "trying to establish " << _iter->endpoint->protocol() << " connection to "
- << _iter->connector->toString();
+ if(_instance->traceLevels()->network >= 2)
+ {
+ Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
+ out << "trying to establish " << _iter->endpoint->protocol() << " connection to "
+ << _iter->connector->toString();
+ }
+ Ice::ConnectionIPtr connection = _factory->createConnection(_iter->connector->connect(), *_iter);
+ connection->start(this);
}
- connection = _factory->createConnection(_iter->connector->connect(), *_iter);
- connection->start(this);
- }
- catch(const Ice::LocalException& ex)
- {
- if(_instance->traceLevels()->network >= 2)
+ catch(const Ice::LocalException& ex)
{
- Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
- out << "failed to establish " << _iter->endpoint->protocol() << " connection to "
- << _iter->connector->toString() << "\n" << ex;
+ if(_instance->traceLevels()->network >= 2)
+ {
+ Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
+ out << "failed to establish " << _iter->endpoint->protocol() << " connection to "
+ << _iter->connector->toString() << "\n" << ex;
+ }
+
+ if(connectionStartFailedImpl(ex))
+ {
+ continue; // More connectors to try, continue.
+ }
}
- connectionStartFailed(connection, ex);
+ break;
}
}
@@ -1071,6 +1061,31 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::operator<(const Connect
return this < &rhs;
}
+bool
+IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailedImpl(const Ice::LocalException& ex)
+{
+ if(_observer)
+ {
+ _observer->failed(ex.ice_name());
+ _observer->detach();
+ }
+
+ _factory->handleConnectionException(ex, _hasMore || _iter != _connectors.end() - 1);
+ if(dynamic_cast<const Ice::CommunicatorDestroyedException*>(&ex)) // No need to continue.
+ {
+ _factory->finishGetConnection(_connectors, ex, this);
+ }
+ else if(++_iter != _connectors.end()) // Try the next connector.
+ {
+ return true;
+ }
+ else
+ {
+ _factory->finishGetConnection(_connectors, ex, this);
+ }
+ return false;
+}
+
void
IceInternal::IncomingConnectionFactory::activate()
{