diff options
author | Benoit Foucher <benoit@zeroc.com> | 2016-09-20 17:16:19 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2016-09-20 17:16:19 +0200 |
commit | ce0aaeebcd6cbde54702343daa9c25db7fb7e03c (patch) | |
tree | 991f3c4221889a6260e28d49b4b08f95ba3217aa /cpp | |
parent | ICE-7081 - JavaScript testsuite should install a global error handler (diff) | |
download | ice-ce0aaeebcd6cbde54702343daa9c25db7fb7e03c.tar.bz2 ice-ce0aaeebcd6cbde54702343daa9c25db7fb7e03c.tar.xz ice-ce0aaeebcd6cbde54702343daa9c25db7fb7e03c.zip |
Fixed ICE-7289 - forcefully close the connection when the session is gone
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.cpp | 122 |
1 files changed, 61 insertions, 61 deletions
diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 4de4a8888d1..43e71bfb4e0 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -36,7 +36,7 @@ public: void finished(const Ice::AsyncResultPtr& r) - { + { Ice::ObjectPrx o = r->getProxy(); try { @@ -68,7 +68,7 @@ public: void finished(const Ice::AsyncResultPtr& r) - { + { Ice::ObjectPrx o = r->getProxy(); try { @@ -80,11 +80,11 @@ public: // Close the connection otherwise the peer has no way to know that // the session has gone. // - _connection->close(false); + _connection->close(true); _router->destroySession(_connection); } } - + private: const SessionRouterIPtr _router; @@ -99,7 +99,7 @@ class SessionControlI : public SessionControl { public: - SessionControlI(const SessionRouterIPtr& sessionRouter, const ConnectionPtr& connection, + SessionControlI(const SessionRouterIPtr& sessionRouter, const ConnectionPtr& connection, const FilterManagerPtr& filterManager) : _sessionRouter(sessionRouter), _connection(connection), @@ -122,7 +122,7 @@ public: virtual IdentitySetPrx identities(const Current&) { - return _filters->identitiesPrx(); + return _filters->identitiesPrx(); } virtual int @@ -130,7 +130,7 @@ public: { return static_cast<int>(_sessionRouter->getSessionTimeout(current)); } - + virtual void destroy(const Current&) { @@ -153,7 +153,7 @@ public: _sessionRouter(sessionRouter) { } - + virtual ObjectPtr locate(const Current& current, LocalObjectPtr&) { @@ -183,7 +183,7 @@ public: _sessionRouter(sessionRouter) { } - + virtual ObjectPtr locate(const Current& current, LocalObjectPtr&) { @@ -209,14 +209,14 @@ class UserPasswordCreateSession : public CreateSession { public: - UserPasswordCreateSession(const AMD_Router_createSessionPtr& amdCB, const string& user, const string& password, + UserPasswordCreateSession(const AMD_Router_createSessionPtr& amdCB, const string& user, const string& password, const Ice::Current& current, const SessionRouterIPtr& sessionRouter) : CreateSession(sessionRouter, user, current), - _amdCB(amdCB), + _amdCB(amdCB), _password(password) { } - + void checkPermissionsResponse(bool ok, const string& reason) @@ -251,7 +251,7 @@ public: Ice::Context ctx = _current.ctx; ctx.insert(_context.begin(), _context.end()); - + _sessionRouter->_verifier->begin_checkPermissions(_user, _password, ctx, newCallback_PermissionsVerifier_checkPermissions(this, &UserPasswordCreateSession::checkPermissionsResponse, @@ -272,10 +272,10 @@ public: _sessionRouter->_sessionManager->begin_create(_user, _control, ctx, newCallback_SessionManager_create( static_cast<CreateSession*>(this), - &CreateSession::sessionCreated, + &CreateSession::sessionCreated, &CreateSession::createException)); } - + virtual void finished(const SessionPrx& session) { @@ -298,14 +298,14 @@ class SSLCreateSession : public CreateSession { public: - SSLCreateSession(const AMD_Router_createSessionFromSecureConnectionPtr& amdCB, const string& user, + SSLCreateSession(const AMD_Router_createSessionFromSecureConnectionPtr& amdCB, const string& user, const SSLInfo& sslInfo, const Ice::Current& current, const SessionRouterIPtr& sessionRouter) : CreateSession(sessionRouter, user, current), - _amdCB(amdCB), + _amdCB(amdCB), _sslInfo(sslInfo) { } - + void authorizeResponse(bool ok, const string& reason) { @@ -339,9 +339,9 @@ public: Ice::Context ctx = _current.ctx; ctx.insert(_context.begin(), _context.end()); - _sessionRouter->_sslVerifier->begin_authorize(_sslInfo, ctx, + _sessionRouter->_sslVerifier->begin_authorize(_sslInfo, ctx, newCallback_SSLPermissionsVerifier_authorize(this, - &SSLCreateSession::authorizeResponse, + &SSLCreateSession::authorizeResponse, &SSLCreateSession::authorizeException)); } @@ -359,10 +359,10 @@ public: _sessionRouter->_sslSessionManager->begin_create(_sslInfo, _control, ctx, newCallback_SSLSessionManager_create( static_cast<CreateSession*>(this), - &CreateSession::sessionCreated, + &CreateSession::sessionCreated, &CreateSession::createException)); } - + virtual void finished(const SessionPrx& session) { @@ -388,7 +388,7 @@ public: ConnectionCallbackI(const SessionRouterIPtr& sessionRouter) : _sessionRouter(sessionRouter) { } - + virtual void heartbeat(const Ice::ConnectionPtr& connection) { @@ -571,7 +571,7 @@ CreateSession::sessionCreated(const SessionPrx& session) // Notify the router that the creation is finished. // try - { + { _sessionRouter->finishCreateSession(_current.con, router); finished(session); } @@ -601,13 +601,13 @@ void CreateSession::exception(const Ice::Exception& ex) { try - { + { _sessionRouter->finishCreateSession(_current.con, 0); } catch(const Ice::Exception&) { } - + finished(ex); if(_control) @@ -671,7 +671,7 @@ SessionRouterI::SessionRouterI(const InstancePtr& instance, // a router servant based on connection information. // _instance->clientObjectAdapter()->addServantLocator(new ClientLocator(this), ""); - + // // If there is a server object adapter, all calls on this adapter // are dispatched to a router servant based on the category field @@ -709,17 +709,17 @@ SessionRouterI::destroy() Callback_Session_destroyPtr destroyCallback; { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); - + assert(!_destroy); _destroy = true; notify(); - + _routersByConnection.swap(routers); _routersByConnectionHint = _routersByConnection.end(); - + _routersByCategory.clear(); _routersByCategoryHint = _routersByCategory.end(); - + sessionThread = _sessionThread; _sessionThread = 0; @@ -780,7 +780,7 @@ SessionRouterI::getCategoryForClient(const Ice::Current& current) const } void -SessionRouterI::createSession_async(const AMD_Router_createSessionPtr& amdCB, const std::string& userId, +SessionRouterI::createSession_async(const AMD_Router_createSessionPtr& amdCB, const std::string& userId, const std::string& password, const Current& current) { if(!_verifier) @@ -891,7 +891,7 @@ SessionRouterI::refreshSession(const Ice::ConnectionPtr& con) // Close the connection otherwise the peer has no way to know that the // session has gone. // - con->close(false); + con->close(true); throw SessionNotExistException(); } } @@ -913,14 +913,14 @@ SessionRouterI::destroySession(const ConnectionPtr& connection) { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); - + if(_destroy) { throw ObjectNotExistException(__FILE__, __LINE__); } - - map<ConnectionPtr, RouterIPtr>::iterator p; - + + map<ConnectionPtr, RouterIPtr>::iterator p; + if(_routersByConnectionHint != _routersByConnection.end() && _routersByConnectionHint->first == connection) { p = _routersByConnectionHint; @@ -929,17 +929,17 @@ SessionRouterI::destroySession(const ConnectionPtr& connection) { p = _routersByConnection.find(connection); } - + if(p == _routersByConnection.end()) { throw SessionNotExistException(); } - + router = p->second; _routersByConnection.erase(p++); _routersByConnectionHint = p; - + if(_instance->serverObjectAdapter()) { string category = router->getServerProxy(Current())->ice_getIdentity().category; @@ -973,7 +973,7 @@ SessionRouterI::getACMTimeout(const Ice::Current& current) const return current.con->getACM().timeout; } -void +void SessionRouterI::updateSessionObservers() { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); @@ -984,7 +984,7 @@ SessionRouterI::updateSessionObservers() for(map<ConnectionPtr, RouterIPtr>::iterator p = _routersByConnection.begin(); p != _routersByConnection.end(); ++p) { p->second->updateObserver(observer); - } + } } RouterIPtr @@ -1017,7 +1017,7 @@ SessionRouterI::getServerBlobject(const string& category) const { return _routersByCategoryHint->second->getServerBlobject(); } - + map<string, RouterIPtr>::iterator p = routers.find(category); if(p != routers.end()) @@ -1035,30 +1035,30 @@ void SessionRouterI::expireSessions() { vector<RouterIPtr> routers; - + { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); - + if(_destroy) { return; } - + assert(_sessionTimeout > IceUtil::Time()); IceUtil::Time minTimestamp = IceUtil::Time::now(IceUtil::Time::Monotonic) - _sessionTimeout; - + map<ConnectionPtr, RouterIPtr>::iterator p = _routersByConnection.begin(); - + while(p != _routersByConnection.end()) { if(p->second->getTimestamp() < minTimestamp) { RouterIPtr router = p->second; routers.push_back(router); - + _routersByConnection.erase(p++); _routersByConnectionHint = p; - + if(_instance->serverObjectAdapter()) { string category = router->getServerProxy(Current())->ice_getIdentity().category; @@ -1073,7 +1073,7 @@ SessionRouterI::expireSessions() } } } - + // // We destroy the expired routers outside the thread // synchronization, to avoid deadlocks. @@ -1104,7 +1104,7 @@ SessionRouterI::getRouterImpl(const ConnectionPtr& connection, const Ice::Identi _routersByConnectionHint->second->updateTimestamp(); return _routersByConnectionHint->second; } - + map<ConnectionPtr, RouterIPtr>::iterator p = routers.find(connection); if(p != routers.end()) @@ -1141,7 +1141,7 @@ bool SessionRouterI::startCreateSession(const CreateSessionPtr& cb, const ConnectionPtr& connection) { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); - + if(_destroy) { CannotCreateSessionException exc; @@ -1153,7 +1153,7 @@ SessionRouterI::startCreateSession(const CreateSessionPtr& cb, const ConnectionP // Check whether a session already exists for the connection. // { - map<ConnectionPtr, RouterIPtr>::iterator p; + map<ConnectionPtr, RouterIPtr>::iterator p; if(_routersByConnectionHint != _routersByConnection.end() && _routersByConnectionHint->first == connection) { @@ -1163,7 +1163,7 @@ SessionRouterI::startCreateSession(const CreateSessionPtr& cb, const ConnectionP { p = _routersByConnection.find(connection); } - + if(p != _routersByConnection.end()) { CannotCreateSessionException exc; @@ -1198,14 +1198,14 @@ void SessionRouterI::finishCreateSession(const ConnectionPtr& connection, const RouterIPtr& router) { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); - + // // Signal other threads that we are done with trying to // establish a session for our connection; // _pending.erase(connection); notify(); - + if(!router) { return; @@ -1219,15 +1219,15 @@ SessionRouterI::finishCreateSession(const ConnectionPtr& connection, const Route exc.reason = "router is shutting down"; throw exc; } - + _routersByConnectionHint = _routersByConnection.insert( _routersByConnectionHint, pair<const ConnectionPtr, RouterIPtr>(connection, router)); - + if(_instance->serverObjectAdapter()) { string category = router->getServerProxy()->ice_getIdentity().category; assert(!category.empty()); - pair<map<string, RouterIPtr>::iterator, bool> rc = + pair<map<string, RouterIPtr>::iterator, bool> rc = _routersByCategory.insert(pair<const string, RouterIPtr>(category, router)); assert(rc.second); _routersByCategoryHint = rc.first; @@ -1277,7 +1277,7 @@ SessionRouterI::SessionThread::run() { return; } - + assert(_sessionTimeout > IceUtil::Time()); timedWait(_sessionTimeout / 4); |