diff options
Diffstat (limited to 'cpp/src/Ice/ConnectionFactory.cpp')
-rw-r--r-- | cpp/src/Ice/ConnectionFactory.cpp | 98 |
1 files changed, 57 insertions, 41 deletions
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp index 78370ed4b50..43dc7f670ce 100644 --- a/cpp/src/Ice/ConnectionFactory.cpp +++ b/cpp/src/Ice/ConnectionFactory.cpp @@ -875,26 +875,10 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailed(c const LocalException& ex) { assert(_iter != _connectors.end()); - - if(_observer) - { - _observer->failed(ex.ice_id()); - _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, shared_from_this()); - } - else if(++_iter != _connectors.end()) // Try the next connector. + if(connectionStartFailedImpl(ex)) { nextConnector(); } - else - { - _factory->finishGetConnection(_connectors, ex, shared_from_this()); - } } // @@ -1020,39 +1004,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(ICE_SHARED_FROM_THIS); } - connection = _factory->createConnection(_iter->connector->connect(), *_iter); - connection->start(ICE_SHARED_FROM_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; } } @@ -1111,6 +1102,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_id()); + _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, ICE_SHARED_FROM_THIS); + } + else if(++_iter != _connectors.end()) // Try the next connector. + { + return true; + } + else + { + _factory->finishGetConnection(_connectors, ex, ICE_SHARED_FROM_THIS); + } + return false; +} + void IceInternal::IncomingConnectionFactory::activate() { |