From 8d657499e5e2a76fa9d73598ee276617c265f53c Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Tue, 19 Apr 2011 13:49:39 +0200 Subject: More IceGrid fixes to reduce startup delays if some slaves are unavailable --- cpp/src/IceGrid/NodeSessionManager.cpp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'cpp/src/IceGrid/NodeSessionManager.cpp') diff --git a/cpp/src/IceGrid/NodeSessionManager.cpp b/cpp/src/IceGrid/NodeSessionManager.cpp index 0863039e950..ccfc8026f87 100644 --- a/cpp/src/IceGrid/NodeSessionManager.cpp +++ b/cpp/src/IceGrid/NodeSessionManager.cpp @@ -65,8 +65,15 @@ NodeSessionKeepAliveThread::createSession(InternalRegistryPrx& registry, IceUtil if(!session) { - for(vector::const_iterator p = _queryObjects.begin(); p != _queryObjects.end(); ++p) + vector results; + for(vector::const_iterator q = _queryObjects.begin(); q != _queryObjects.end(); ++q) { + results.push_back((*q)->begin_findObjectById(registry->ice_getIdentity())); + } + + for(vector::const_iterator p = results.begin(); p != results.end(); ++p) + { + QueryPrx query = QueryPrx::uncheckedCast((*p)->getProxy()); if(isDestroyed()) { break; @@ -75,7 +82,7 @@ NodeSessionKeepAliveThread::createSession(InternalRegistryPrx& registry, IceUtil InternalRegistryPrx newRegistry; try { - Ice::ObjectPrx obj = (*p)->findObjectById(registry->ice_getIdentity()); + Ice::ObjectPrx obj = query->end_findObjectById(*p); newRegistry = InternalRegistryPrx::uncheckedCast(obj); if(newRegistry && used.find(newRegistry) == used.end()) { @@ -528,9 +535,16 @@ NodeSessionManager::createdSession(const NodeSessionPrx& session) } else { + vector results; + for(vector::const_iterator q = _queryObjects.begin(); q != _queryObjects.end(); ++q) + { + results.push_back((*q)->begin_findAllObjectsByType(InternalRegistry::ice_staticId())); + } + map proxies; - for(vector::const_iterator p = _queryObjects.begin(); p != _queryObjects.end(); ++p) + for(vector::const_iterator p = results.begin(); p != results.end(); ++p) { + QueryPrx query = QueryPrx::uncheckedCast((*p)->getProxy()); if(isDestroyed()) { return; @@ -538,7 +552,7 @@ NodeSessionManager::createdSession(const NodeSessionPrx& session) try { - Ice::ObjectProxySeq prxs = (*p)->findAllObjectsByType(InternalRegistry::ice_staticId()); + Ice::ObjectProxySeq prxs = query->end_findAllObjectsByType(*p); for(Ice::ObjectProxySeq::const_iterator q = prxs.begin(); q != prxs.end(); ++q) { // @@ -594,13 +608,19 @@ NodeSessionManager::createdSession(const NodeSessionPrx& session) // the replica sessions are created before the node adapter is // activated. // + IceUtil::Time before = IceUtil::Time::now(); for(vector::const_iterator p = sessions.begin(); p != sessions.end(); ++p) { if(isDestroyed()) { return; } - (*p)->tryCreateSession(true, IceUtil::Time::seconds(5)); + IceUtil::Time timeout = IceUtil::Time::seconds(5) - (IceUtil::Time::now() - before); + if(timeout <= IceUtil::Time()) + { + break; + } + (*p)->tryCreateSession(true, timeout); } } -- cgit v1.2.3