summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/RegistryI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceGrid/RegistryI.cpp')
-rw-r--r--cpp/src/IceGrid/RegistryI.cpp249
1 files changed, 95 insertions, 154 deletions
diff --git a/cpp/src/IceGrid/RegistryI.cpp b/cpp/src/IceGrid/RegistryI.cpp
index 5851922e2a8..f7cfd0e4625 100644
--- a/cpp/src/IceGrid/RegistryI.cpp
+++ b/cpp/src/IceGrid/RegistryI.cpp
@@ -29,7 +29,7 @@
#include <IceGrid/SessionI.h>
#include <IceGrid/AdminSessionI.h>
#include <IceGrid/InternalRegistryI.h>
-#include <IceGrid/SessionServantLocatorI.h>
+#include <IceGrid/SessionServantManager.h>
#include <IceGrid/FileUserAccountMapperI.h>
#include <IceGrid/WellKnownObjectsManager.h>
#include <IceGrid/FileCache.h>
@@ -118,33 +118,6 @@ private:
const std::map<std::string, std::string> _passwords;
};
-
-class DefaultServantLocator : public Ice::ServantLocator
-{
-public:
-
- DefaultServantLocator(const ObjectPtr& servant) :
- _servant(servant)
- {
- }
-
- virtual ObjectPtr locate(const Current& c, LocalObjectPtr&)
- {
- return _servant;
- }
-
- virtual void finished(const Current&, const ObjectPtr&, const LocalObjectPtr&)
- {
- }
-
- virtual void deactivate(const string&)
- {
- }
-
-private:
- ObjectPtr _servant;
-};
-
}
RegistryI::RegistryI(const CommunicatorPtr& communicator, const TraceLevelsPtr& traceLevels) :
@@ -321,8 +294,7 @@ RegistryI::start(bool nowarn)
_wellKnownObjects = new WellKnownObjectsManager(_database);
//
- // Get the saved replica/node proxies and remove them from the
- // database.
+ // Get the saved replica/node proxies and remove them from the database.
//
Ice::ObjectProxySeq proxies;
Ice::ObjectProxySeq::const_iterator p;
@@ -362,28 +334,11 @@ RegistryI::start(bool nowarn)
ObjectAdapterPtr serverAdapter = _communicator->createObjectAdapter("IceGrid.Registry.Server");
_clientAdapter = _communicator->createObjectAdapter("IceGrid.Registry.Client");
- ObjectAdapterPtr sessionManagerAdapter;
- if(!properties->getProperty("IceGrid.Registry.SessionManager.Endpoints").empty())
- {
- sessionManagerAdapter = _communicator->createObjectAdapter("IceGrid.Registry.SessionManager");
-
-
- //
- // Add a servant locator for Server Admin objects routed through the registry
- // (and later through nodes)
- //
- sessionManagerAdapter->addServantLocator(new DefaultServantLocator(new RegistryServerAdminRouter(this, _database, false)),
- getServerAdminCategory());
- }
Ice::Identity dummy;
dummy.name = "dummy";
_wellKnownObjects->addEndpoint("Client", _clientAdapter->createDirectProxy(dummy));
_wellKnownObjects->addEndpoint("Server", serverAdapter->createDirectProxy(dummy));
- if(sessionManagerAdapter)
- {
- _wellKnownObjects->addEndpoint("SessionManager", sessionManagerAdapter->createDirectProxy(dummy));
- }
_wellKnownObjects->addEndpoint("Internal", registryAdapter->createDirectProxy(dummy));
setupNullPermissionsVerifier(registryAdapter);
@@ -398,24 +353,18 @@ RegistryI::start(bool nowarn)
Ice::LocatorRegistryPrx locatorRegistry = setupLocatorRegistry(serverAdapter);
LocatorPrx internalLocator = setupLocator(_clientAdapter, registryAdapter, locatorRegistry, registry, query);
-
//
- // Add a servant locator for Server Admin objects routed through the registry
- // (and later through nodes)
+ // Create the session servant manager. The session servant manager is responsible
+ // for managing sessions servants and to ensure that session servants are only
+ // accessed by the connection that created the session. The session servant manager
+ // also takes care of providing the router servant for server admin objects.
//
- _clientAdapter->addServantLocator(new DefaultServantLocator(new RegistryServerAdminRouter(this, _database, true)),
- getServerAdminCategory());
-
- //
- // Add a default servant locator to the client object adapter. The
- // default servant ensure that request on session objects are from
- // the same connection as the connection that created the session.
- //
- _sessionServantLocator = new SessionServantLocatorI(_clientAdapter, _instanceName);
- _clientAdapter->addServantLocator(_sessionServantLocator, "");
+ Ice::ObjectPtr router = new RegistryServerAdminRouter(_database);
+ _servantManager = new SessionServantManager(_clientAdapter, _instanceName, true, getServerAdminCategory(), router);
+ _clientAdapter->addServantLocator(_servantManager, "");
- setupClientSessionFactory(registryAdapter, sessionManagerAdapter, internalLocator, nowarn);
- setupAdminSessionFactory(registryAdapter, sessionManagerAdapter, internalLocator, nowarn);
+ Ice::ObjectAdapterPtr sessionAdpt = setupClientSessionFactory(registryAdapter, internalLocator, nowarn);
+ Ice::ObjectAdapterPtr admSessionAdpt = setupAdminSessionFactory(registryAdapter, router, internalLocator, nowarn);
_wellKnownObjects->finish();
if(_master)
@@ -432,9 +381,13 @@ RegistryI::start(bool nowarn)
//
serverAdapter->activate();
_clientAdapter->activate();
- if(sessionManagerAdapter)
+ if(sessionAdpt)
+ {
+ sessionAdpt->activate();
+ }
+ if(admSessionAdpt)
{
- sessionManagerAdapter->activate();
+ admSessionAdpt->activate();
}
return true;
@@ -560,38 +513,48 @@ RegistryI::setupUserAccountMapper(const Ice::ObjectAdapterPtr& registryAdapter)
return true;
}
-void
+Ice::ObjectAdapterPtr
RegistryI::setupClientSessionFactory(const Ice::ObjectAdapterPtr& registryAdapter,
- const Ice::ObjectAdapterPtr& sessionManagerAdapter,
const IceGrid::LocatorPrx& locator,
bool nowarn)
{
+ Ice::PropertiesPtr properties = _communicator->getProperties();
- _timer = new IceUtil::Timer(); // Used for for session allocation timeout.
+ Ice::ObjectAdapterPtr adapter;
+ SessionServantManagerPtr servantManager;
+ if(!properties->getProperty("IceGrid.Registry.SessionManager.Endpoints").empty())
+ {
+ adapter = _communicator->createObjectAdapter("IceGrid.Registry.SessionManager");
+ servantManager = new SessionServantManager(adapter, _instanceName, false, "", 0);
+ adapter->addServantLocator(servantManager, "");
+ }
assert(_reaper);
- _clientSessionFactory = new ClientSessionFactory(sessionManagerAdapter, _database, _timer, _reaper);
+ _timer = new IceUtil::Timer(); // Used for for session allocation timeout.
+ _clientSessionFactory = new ClientSessionFactory(servantManager, _database, _timer, _reaper);
- if(sessionManagerAdapter && _master) // Slaves don't support client session manager objects.
+ if(servantManager && _master) // Slaves don't support client session manager objects.
{
- Identity clientSessionMgrId;
- clientSessionMgrId.category = _instanceName;
- clientSessionMgrId.name = "SessionManager";
- Identity sslClientSessionMgrId;
- sslClientSessionMgrId.category = _instanceName;
- sslClientSessionMgrId.name = "SSLSessionManager";
+ Identity sessionMgrId;
+ sessionMgrId.category = _instanceName;
+ sessionMgrId.name = "SessionManager";
+ Identity sslSessionMgrId;
+ sslSessionMgrId.category = _instanceName;
+ sslSessionMgrId.name = "SSLSessionManager";
- sessionManagerAdapter->add(new ClientSessionManagerI(_clientSessionFactory), clientSessionMgrId);
- sessionManagerAdapter->add(new ClientSSLSessionManagerI(_clientSessionFactory), sslClientSessionMgrId);
+ adapter->add(new ClientSessionManagerI(_clientSessionFactory), sessionMgrId);
+ adapter->add(new ClientSSLSessionManagerI(_clientSessionFactory), sslSessionMgrId);
- _wellKnownObjects->add(sessionManagerAdapter->createProxy(clientSessionMgrId),
- Glacier2::SessionManager::ice_staticId());
-
- _wellKnownObjects->add(sessionManagerAdapter->createProxy(sslClientSessionMgrId),
- Glacier2::SSLSessionManager::ice_staticId());
+ _wellKnownObjects->add(adapter->createProxy(sessionMgrId), Glacier2::SessionManager::ice_staticId());
+ _wellKnownObjects->add(adapter->createProxy(sslSessionMgrId), Glacier2::SSLSessionManager::ice_staticId());
}
- Ice::PropertiesPtr properties = _communicator->getProperties();
+ if(adapter)
+ {
+ Ice::Identity dummy;
+ dummy.name = "dummy";
+ _wellKnownObjects->addEndpoint("SessionManager", adapter->createDirectProxy(dummy));
+ }
_clientVerifier = getPermissionsVerifier(registryAdapter,
locator,
@@ -602,41 +565,57 @@ RegistryI::setupClientSessionFactory(const Ice::ObjectAdapterPtr& registryAdapte
_sslClientVerifier = getSSLPermissionsVerifier(locator,
"IceGrid.Registry.SSLPermissionsVerifier",
nowarn);
+
+ return adapter;
}
-void
+Ice::ObjectAdapterPtr
RegistryI::setupAdminSessionFactory(const Ice::ObjectAdapterPtr& registryAdapter,
- const Ice::ObjectAdapterPtr& sessionManagerAdapter,
+ const Ice::ObjectPtr& router,
const IceGrid::LocatorPrx& locator,
bool nowarn)
{
+ Ice::PropertiesPtr properties = _communicator->getProperties();
+
+ Ice::ObjectAdapterPtr adapter;
+ SessionServantManagerPtr servantManager;
+ if(!properties->getProperty("IceGrid.Registry.AdminSessionManager.Endpoints").empty())
+ {
+ adapter = _communicator->createObjectAdapter("IceGrid.Registry.AdminSessionManager");
+ servantManager = new SessionServantManager(adapter, _instanceName, false, getServerAdminCategory(), router);
+ adapter->addServantLocator(servantManager, "");
+ }
+
assert(_reaper);
- _adminSessionFactory = new AdminSessionFactory(sessionManagerAdapter, _database, _reaper, this);
+ _adminSessionFactory = new AdminSessionFactory(servantManager, _database, _reaper, this);
- if(sessionManagerAdapter)
+ if(servantManager)
{
- Identity adminSessionMgrId;
- adminSessionMgrId.category = _instanceName;
- adminSessionMgrId.name = "AdminSessionManager";
- Identity sslAdmSessionMgrId;
- sslAdmSessionMgrId.category = _instanceName;
- sslAdmSessionMgrId.name = "AdminSSLSessionManager";
+ Identity sessionMgrId;
+ sessionMgrId.category = _instanceName;
+ sessionMgrId.name = "AdminSessionManager";
+ Identity sslSessionMgrId;
+ sslSessionMgrId.category = _instanceName;
+ sslSessionMgrId.name = "AdminSSLSessionManager";
if(!_master)
{
- adminSessionMgrId.name += "-" + _replicaName;
- sslAdmSessionMgrId.name += "-" + _replicaName;
+ sessionMgrId.name += "-" + _replicaName;
+ sslSessionMgrId.name += "-" + _replicaName;
}
- sessionManagerAdapter->add(new AdminSessionManagerI(_adminSessionFactory), adminSessionMgrId);
- sessionManagerAdapter->add(new AdminSSLSessionManagerI(_adminSessionFactory), sslAdmSessionMgrId);
+ adapter->add(new AdminSessionManagerI(_adminSessionFactory), sessionMgrId);
+ adapter->add(new AdminSSLSessionManagerI(_adminSessionFactory), sslSessionMgrId);
- _wellKnownObjects->add(sessionManagerAdapter->createProxy(adminSessionMgrId),
- Glacier2::SessionManager::ice_staticId());
- _wellKnownObjects->add(sessionManagerAdapter->createProxy(sslAdmSessionMgrId),
- Glacier2::SSLSessionManager::ice_staticId());
+ _wellKnownObjects->add(adapter->createProxy(sessionMgrId), Glacier2::SessionManager::ice_staticId());
+ _wellKnownObjects->add(adapter->createProxy(sslSessionMgrId), Glacier2::SSLSessionManager::ice_staticId());
}
- Ice::PropertiesPtr properties = _communicator->getProperties();
+ if(adapter)
+ {
+ Ice::Identity dummy;
+ dummy.name = "dummy";
+ _wellKnownObjects->addEndpoint("AdminSessionManager", adapter->createDirectProxy(dummy));
+ }
_adminVerifier = getPermissionsVerifier(registryAdapter,
locator,
@@ -644,10 +623,11 @@ RegistryI::setupAdminSessionFactory(const Ice::ObjectAdapterPtr& registryAdapter
properties->getProperty("IceGrid.Registry.AdminCryptPasswords"),
nowarn);
- _sslAdminVerifier =
- getSSLPermissionsVerifier(locator,
- "IceGrid.Registry.AdminSSLPermissionsVerifier",
- nowarn);
+ _sslAdminVerifier = getSSLPermissionsVerifier(locator,
+ "IceGrid.Registry.AdminSSLPermissionsVerifier",
+ nowarn);
+
+ return adapter;
}
void
@@ -750,11 +730,8 @@ RegistryI::createSession(const string& user, const string& password, const Curre
}
SessionIPtr session = _clientSessionFactory->createSessionServant(user, 0);
- Ice::ObjectPrx proxy = session->registerWithServantLocator(_sessionServantLocator, current.con);
- if(_sessionTimeout > 0)
- {
- _reaper->add(new SessionReapable<SessionI>(_traceLevels->logger, session), _sessionTimeout);
- }
+ Ice::ObjectPrx proxy = session->_register(_servantManager, current.con);
+ _reaper->add(new SessionReapable<SessionI>(_traceLevels->logger, session), _sessionTimeout);
return SessionPrx::uncheckedCast(proxy);
}
@@ -803,13 +780,8 @@ RegistryI::createAdminSession(const string& user, const string& password, const
}
AdminSessionIPtr session = _adminSessionFactory->createSessionServant(user);
- Ice::ObjectPrx proxy = session->registerWithServantLocator(_sessionServantLocator, current.con, this);
- addAdminSessionConnection(current.con);
-
- if(_sessionTimeout > 0)
- {
- _reaper->add(new SessionReapable<AdminSessionI>(_traceLevels->logger, session), _sessionTimeout);
- }
+ Ice::ObjectPrx proxy = session->_register(_servantManager, current.con);
+ _reaper->add(new SessionReapable<AdminSessionI>(_traceLevels->logger, session), _sessionTimeout);
return AdminSessionPrx::uncheckedCast(proxy);
}
@@ -867,11 +839,8 @@ RegistryI::createSessionFromSecureConnection(const Current& current)
}
SessionIPtr session = _clientSessionFactory->createSessionServant(userDN, 0);
- Ice::ObjectPrx proxy = session->registerWithServantLocator(_sessionServantLocator, current.con);
- if(_sessionTimeout > 0)
- {
- _reaper->add(new SessionReapable<SessionI>(_traceLevels->logger, session), _sessionTimeout);
- }
+ Ice::ObjectPrx proxy = session->_register(_servantManager, current.con);
+ _reaper->add(new SessionReapable<SessionI>(_traceLevels->logger, session), _sessionTimeout);
return SessionPrx::uncheckedCast(proxy);
}
@@ -918,12 +887,8 @@ RegistryI::createAdminSessionFromSecureConnection(const Current& current)
// We let the connection access the administrative interface.
//
AdminSessionIPtr session = _adminSessionFactory->createSessionServant(userDN);
- Ice::ObjectPrx proxy = session->registerWithServantLocator(_sessionServantLocator, current.con, this);
- addAdminSessionConnection(current.con);
- if(_sessionTimeout > 0)
- {
- _reaper->add(new SessionReapable<AdminSessionI>(_traceLevels->logger, session), _sessionTimeout);
- }
+ Ice::ObjectPrx proxy = session->_register(_servantManager, current.con);
+ _reaper->add(new SessionReapable<AdminSessionI>(_traceLevels->logger, session), _sessionTimeout);
return AdminSessionPrx::uncheckedCast(proxy);
}
@@ -959,27 +924,6 @@ RegistryI::shutdown()
_clientAdapter->deactivate();
}
-bool
-RegistryI::isAdminSessionConnection(const ConnectionPtr& con) const
-{
- IceUtil::Mutex::Lock sync(_adminSessionConnectionsMutex);
- return _adminSessionConnections.find(con) != _adminSessionConnections.end();
-}
-
-void
-RegistryI::addAdminSessionConnection(const ConnectionPtr& con)
-{
- IceUtil::Mutex::Lock sync(_adminSessionConnectionsMutex);
- _adminSessionConnections.insert(con);
-}
-
-void
-RegistryI::removeAdminSessionConnection(const ConnectionPtr& con)
-{
- IceUtil::Mutex::Lock sync(_adminSessionConnectionsMutex);
- _adminSessionConnections.erase(con);
-}
-
void
RegistryI::setupThreadPool(const PropertiesPtr& properties, const string& name, int size, int sizeMax)
{
@@ -1254,6 +1198,7 @@ RegistryI::registerReplicas(const InternalRegistryPrx& internalRegistry,
try
{
(*r)->registerWithReplica(internalRegistry);
+
NodePrxSeq nds = (*r)->getNodes();
nodes.insert(nds.begin(), nds.end());
@@ -1286,16 +1231,12 @@ RegistryI::registerReplicas(const InternalRegistryPrx& internalRegistry,
}
}
-#ifdef _RWSTD_NO_MEMBER_TEMPLATES
NodePrxSeq result;
for(set<NodePrx>::iterator p = nodes.begin(); p != nodes.end(); ++p)
{
result.push_back(*p);
}
return result;
-#else
- return NodePrxSeq(nodes.begin(), nodes.end());
-#endif
}
void