summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IceGrid/AdminSessionI.cpp94
-rw-r--r--cpp/src/IceGrid/AdminSessionI.h41
-rw-r--r--cpp/src/IceGrid/DescriptorHelper.cpp76
-rw-r--r--cpp/src/IceGrid/DescriptorHelper.h1
-rw-r--r--cpp/src/IceGrid/RegistryI.cpp27
-rw-r--r--cpp/src/IceGrid/RegistryI.h12
-rw-r--r--cpp/src/IceGrid/ServerCache.cpp43
-rw-r--r--cpp/src/IceGrid/ServerCache.h3
-rw-r--r--cpp/src/IceGrid/SessionI.cpp93
-rw-r--r--cpp/src/IceGrid/SessionI.h34
10 files changed, 217 insertions, 207 deletions
diff --git a/cpp/src/IceGrid/AdminSessionI.cpp b/cpp/src/IceGrid/AdminSessionI.cpp
index bdbbb9c08e0..564e6d7f2a0 100644
--- a/cpp/src/IceGrid/AdminSessionI.cpp
+++ b/cpp/src/IceGrid/AdminSessionI.cpp
@@ -191,11 +191,13 @@ AdminSessionI::destroy(const Ice::Current& current)
}
}
-AdminSessionManagerI::AdminSessionManagerI(const DatabasePtr& database,
- int sessionTimeout,
- const RegistryObserverTopicPtr& regTopic,
- const NodeObserverTopicPtr& nodeTopic,
- const RegistryIPtr& registry) :
+AdminSessionFactory::AdminSessionFactory(const Ice::ObjectAdapterPtr& adapter,
+ const DatabasePtr& database,
+ int sessionTimeout,
+ const RegistryObserverTopicPtr& regTopic,
+ const NodeObserverTopicPtr& nodeTopic,
+ const RegistryIPtr& registry) :
+ _adapter(adapter),
_database(database),
_timeout(sessionTimeout),
_registryObserverTopic(regTopic),
@@ -205,44 +207,70 @@ AdminSessionManagerI::AdminSessionManagerI(const DatabasePtr& database,
}
Glacier2::SessionPrx
-AdminSessionManagerI::create(const string& userId, const Glacier2::SessionControlPrx&, const Ice::Current& current)
+AdminSessionFactory::createGlacier2Session(const string& sessionId, const Glacier2::SessionControlPrx& ctl)
{
- //
- // TODO: XXX: Modify filtering?
- //
+ Ice::IdentitySeq ids; // Identities of the object the session is allowed to access.
- AdminSessionIPtr session = create(userId);
Ice::Identity id;
+ id.category = _database->getInstanceName();
+
+ // The per-session admin object.
id.name = IceUtil::generateUUID();
- id.category = current.id.category;
- AdminPrx admin = AdminPrx::uncheckedCast(current.adapter->add(new AdminI(_database, _registry, session), id));
+ AdminSessionIPtr session = createSessionServant(sessionId);
+ AdminPrx admin = AdminPrx::uncheckedCast(_adapter->add(new AdminI(_database, _registry, session), id));
session->setAdmin(admin);
+ ids.push_back(id);
+
+ // The session admin object.
id.name = IceUtil::generateUUID();
- return Glacier2::SessionPrx::uncheckedCast(current.adapter->add(session, id));
+ Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(_adapter->add(session, id));
+ ids.push_back(id);
+
+ if(ctl)
+ {
+ try
+ {
+ ctl->identities()->add(ids);
+ }
+ catch(const Ice::LocalException&)
+ {
+ s->destroy();
+ return 0;
+ }
+ }
+
+ return s;
}
AdminSessionIPtr
-AdminSessionManagerI::create(const string& id)
+AdminSessionFactory::createSessionServant(const string& id)
{
return new AdminSessionI(id, _database, _timeout, _registryObserverTopic, _nodeObserverTopic);
}
-AdminSSLSessionManagerI::AdminSSLSessionManagerI(const DatabasePtr& database,
- int sessionTimeout,
- const RegistryObserverTopicPtr& regTopic,
- const NodeObserverTopicPtr& nodeTopic,
- const RegistryIPtr& registry) :
- _database(database),
- _timeout(sessionTimeout),
- _registryObserverTopic(regTopic),
- _nodeObserverTopic(nodeTopic),
- _registry(registry)
+const TraceLevelsPtr&
+AdminSessionFactory::getTraceLevels() const
+{
+ return _database->getTraceLevels();
+}
+
+AdminSessionManagerI::AdminSessionManagerI(const AdminSessionFactoryPtr& factory) : _factory(factory)
+{
+}
+
+Glacier2::SessionPrx
+AdminSessionManagerI::create(const string& userId, const Glacier2::SessionControlPrx& ctl, const Ice::Current& current)
+{
+ return _factory->createGlacier2Session(userId, ctl);
+}
+
+AdminSSLSessionManagerI::AdminSSLSessionManagerI(const AdminSessionFactoryPtr& factory) : _factory(factory)
{
}
Glacier2::SessionPrx
AdminSSLSessionManagerI::create(const Glacier2::SSLInfo& info,
- const Glacier2::SessionControlPrx&,
+ const Glacier2::SessionControlPrx& ctl,
const Ice::Current& current)
{
string userDN;
@@ -256,23 +284,11 @@ AdminSSLSessionManagerI::create(const Glacier2::SSLInfo& info,
catch(const Ice::Exception& ex)
{
// This shouldn't happen, the SSLInfo is supposed to be encoded by Glacier2.
- Ice::Error out(_database->getTraceLevels()->logger);
+ Ice::Error out(_factory->getTraceLevels()->logger);
out << "SSL session manager couldn't decode SSL certificates:\n" << ex;
return 0;
}
}
- //
- // TODO: XXX: Modify filtering?
- //
-
- AdminSessionIPtr session;
- session = new AdminSessionI(userDN, _database, _timeout, _registryObserverTopic, _nodeObserverTopic);
- Ice::Identity id;
- id.name = IceUtil::generateUUID();
- id.category = current.id.category;
- AdminPrx admin = AdminPrx::uncheckedCast(current.adapter->add(new AdminI(_database, _registry, session), id));
- session->setAdmin(admin);
- id.name = IceUtil::generateUUID();
- return Glacier2::SessionPrx::uncheckedCast(current.adapter->add(session, id));
+ return _factory->createGlacier2Session(userDN, ctl);
}
diff --git a/cpp/src/IceGrid/AdminSessionI.h b/cpp/src/IceGrid/AdminSessionI.h
index 0187d5caee3..37b8766b00e 100644
--- a/cpp/src/IceGrid/AdminSessionI.h
+++ b/cpp/src/IceGrid/AdminSessionI.h
@@ -53,44 +53,55 @@ private:
};
typedef IceUtil::Handle<AdminSessionI> AdminSessionIPtr;
-class AdminSessionManagerI : virtual public Glacier2::SessionManager
+class AdminSessionFactory : virtual public IceUtil::Shared
{
public:
- AdminSessionManagerI(const DatabasePtr&, int, const RegistryObserverTopicPtr& , const NodeObserverTopicPtr&,
- const RegistryIPtr&);
+ AdminSessionFactory(const Ice::ObjectAdapterPtr&, const DatabasePtr&, int, const RegistryObserverTopicPtr&,
+ const NodeObserverTopicPtr&, const RegistryIPtr&);
- virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&);
- AdminSessionIPtr create(const std::string&);
+ Glacier2::SessionPrx createGlacier2Session(const std::string&, const Glacier2::SessionControlPrx&);
+ AdminSessionIPtr createSessionServant(const std::string&);
+
+ const TraceLevelsPtr& getTraceLevels() const;
private:
-
+
+ const Ice::ObjectAdapterPtr _adapter;
const DatabasePtr _database;
const int _timeout;
+ const WaitQueuePtr _waitQueue;
const RegistryObserverTopicPtr _registryObserverTopic;
const NodeObserverTopicPtr _nodeObserverTopic;
const RegistryIPtr _registry;
};
-typedef IceUtil::Handle<AdminSessionManagerI> AdminSessionManagerIPtr;
+typedef IceUtil::Handle<AdminSessionFactory> AdminSessionFactoryPtr;
+
+class AdminSessionManagerI : virtual public Glacier2::SessionManager
+{
+public:
+
+ AdminSessionManagerI(const AdminSessionFactoryPtr&);
+
+ virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&);
+
+private:
+
+ const AdminSessionFactoryPtr _factory;
+};
class AdminSSLSessionManagerI : virtual public Glacier2::SSLSessionManager
{
public:
- AdminSSLSessionManagerI(const DatabasePtr&, int, const RegistryObserverTopicPtr& , const NodeObserverTopicPtr&,
- const RegistryIPtr&);
+ AdminSSLSessionManagerI(const AdminSessionFactoryPtr&);
virtual Glacier2::SessionPrx create(const Glacier2::SSLInfo&, const Glacier2::SessionControlPrx&,
const Ice::Current&);
private:
- const DatabasePtr _database;
- const int _timeout;
- const RegistryObserverTopicPtr _registryObserverTopic;
- const NodeObserverTopicPtr _nodeObserverTopic;
- const RegistryIPtr _registry;
+ const AdminSessionFactoryPtr _factory;
};
-typedef IceUtil::Handle<AdminSSLSessionManagerI> AdminSSLSessionManagerIPtr;
};
diff --git a/cpp/src/IceGrid/DescriptorHelper.cpp b/cpp/src/IceGrid/DescriptorHelper.cpp
index a290c29f2b9..c10ab5cde1b 100644
--- a/cpp/src/IceGrid/DescriptorHelper.cpp
+++ b/cpp/src/IceGrid/DescriptorHelper.cpp
@@ -1615,15 +1615,7 @@ ServerInstanceHelper::init(const ServerDescriptorPtr& definition, const Resolver
//
// Set the server definition.
//
- IceBoxDescriptorPtr iceBox = IceBoxDescriptorPtr::dynamicCast(def);
- if(iceBox)
- {
- _serverDefinition = new IceBoxHelper(svrResolve.getCommunicator(), iceBox);
- }
- else
- {
- _serverDefinition = new ServerHelper(resolve.getCommunicator(), def);
- }
+ _serverDefinition = createHelper(svrResolve.getCommunicator(), def);
if(!instantiate)
{
@@ -1654,14 +1646,7 @@ ServerInstanceHelper::init(const ServerDescriptorPtr& definition, const Resolver
// Instantiate the server definition.
//
ServerDescriptorPtr inst = _serverDefinition->instantiate(svrResolve, _instance.propertySet.properties);
- if(iceBox)
- {
- _serverInstance = new IceBoxHelper(svrResolve.getCommunicator(), IceBoxDescriptorPtr::dynamicCast(inst));
- }
- else
- {
- _serverInstance = new ServerHelper(svrResolve.getCommunicator(), inst);
- }
+ _serverInstance = createHelper(svrResolve.getCommunicator(), inst);
}
bool
@@ -1778,15 +1763,6 @@ NodeHelper::NodeHelper(const string& name, const NodeDescriptor& descriptor, con
}
_instance.servers.push_back(helper.getServerInstance());
}
-
- //
- // Validate each property set references.
- //
- PropertySetDescriptorDict::const_iterator ps;
- for(ps = _def.propertySets.begin(); ps != _def.propertySets.end(); ++ps)
- {
- resolve.getProperties(ps->second.references);
- }
}
bool
@@ -1901,25 +1877,24 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv
// * then we add the servers from the node which were not updated or removed.
//
- ServerInstanceHelperDict serverInstances;
- ServerInstanceHelperDict servers;
ServerInstanceHelperDict::const_iterator r;
- ServerInstanceDescriptorSeq::const_iterator q;
- set<string> removedServers(update.removeServers.begin(), update.removeServers.end());
+ set<string> added;
+ set<string> removed(update.removeServers.begin(), update.removeServers.end());
+ ServerInstanceDescriptorSeq::const_iterator q;
for(q = update.serverInstances.begin(); q != update.serverInstances.end(); ++q)
{
ServerInstanceHelper helper(*q, resolve, false);
- if(!serverInstances.insert(make_pair(helper.getId(), helper)).second)
+ if(!added.insert(helper.getId()).second)
{
resolve.exception("duplicate server `" + helper.getId() + "' in node `" + _name + "'");
}
+ def.serverInstances.push_back(helper.getDefinition());
}
for(r = _serverInstances.begin(); r != _serverInstances.end(); ++r)
{
- if(removedServers.find(r->first) != removedServers.end() ||
- serverInstances.find(r->first) != serverInstances.end())
+ if(removed.find(r->first) != removed.end() || added.find(r->first) != added.end())
{
continue;
}
@@ -1935,21 +1910,22 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv
resolve.exception("invalid update in node `" + _name + "':\n" + "server instance id `" + r->first +
"' changed to `" + helper.getId() + "'");
}
- serverInstances.insert(make_pair(helper.getId(), helper));
+ def.serverInstances.push_back(helper.getDefinition());
}
+ added.clear();
for(ServerDescriptorSeq::const_iterator s = update.servers.begin(); s != update.servers.end(); ++s)
{
ServerInstanceHelper helper(*s, resolve, false);
- if(!servers.insert(make_pair(helper.getId(), helper)).second)
+ if(!added.insert(helper.getId()).second)
{
resolve.exception("duplicate server `" + helper.getId() + "' in node `" + _name + "'");
}
+ def.servers.push_back(helper.getServerDefinition());
}
for(r = _servers.begin(); r != _servers.end(); ++r)
{
- if(removedServers.find(r->first) != removedServers.end() ||
- serverInstances.find(r->first) != serverInstances.end())
+ if(removed.find(r->first) != removed.end() || added.find(r->first) != added.end())
{
continue;
}
@@ -1965,18 +1941,8 @@ NodeHelper::update(const NodeUpdateDescriptor& update, const Resolver& appResolv
resolve.exception("invalid update in node `" + _name + "':\nserver instance id `" + r->first +
"' changed to `" + helper.getId() + "'");
}
- servers.insert(make_pair(helper.getId(), helper));
- }
-
- for(r = serverInstances.begin(); r != serverInstances.end(); ++r)
- {
- def.serverInstances.push_back(r->second.getDefinition());
+ def.servers.push_back(helper.getServerDefinition());
}
- for(r = servers.begin(); r != servers.end(); ++r)
- {
- def.servers.push_back(r->second.getServerDefinition());
- }
-
return def;
}
@@ -2863,3 +2829,17 @@ IceGrid::descriptorEqual(const Ice::CommunicatorPtr& com,
return false;
}
}
+
+ServerHelperPtr
+IceGrid::createHelper(const Ice::CommunicatorPtr& communicator, const ServerDescriptorPtr& desc)
+{
+ IceBoxDescriptorPtr iceBox = IceBoxDescriptorPtr::dynamicCast(desc);
+ if(iceBox)
+ {
+ return new IceBoxHelper(communicator, iceBox);
+ }
+ else
+ {
+ return new ServerHelper(communicator, desc);
+ }
+}
diff --git a/cpp/src/IceGrid/DescriptorHelper.h b/cpp/src/IceGrid/DescriptorHelper.h
index 00c98979bfd..b68c996c4d9 100644
--- a/cpp/src/IceGrid/DescriptorHelper.h
+++ b/cpp/src/IceGrid/DescriptorHelper.h
@@ -314,6 +314,7 @@ private:
};
bool descriptorEqual(const Ice::CommunicatorPtr&, const ServerDescriptorPtr&, const ServerDescriptorPtr&);
+ServerHelperPtr createHelper(const Ice::CommunicatorPtr&, const ServerDescriptorPtr&);
}
diff --git a/cpp/src/IceGrid/RegistryI.cpp b/cpp/src/IceGrid/RegistryI.cpp
index ac01df8ef3c..c6ac9494c01 100644
--- a/cpp/src/IceGrid/RegistryI.cpp
+++ b/cpp/src/IceGrid/RegistryI.cpp
@@ -365,20 +365,21 @@ RegistryI::start(bool nowarn)
ObjectPtr admin = new AdminI(_database, this, 0);
adminAdapter->add(admin, adminId);
- Identity clientSessionMgrId = _communicator->stringToIdentity(instanceName + "/SessionManager");
- _clientSessionManager = new ClientSessionManagerI(_database, sessionTimeout, _waitQueue);
- adminAdapter->add(_clientSessionManager, clientSessionMgrId);
+ _clientSessionFactory = new ClientSessionFactory(adminAdapter, _database, sessionTimeout, _waitQueue);
- Identity adminSessionMgrId = _communicator->stringToIdentity(instanceName + "/AdminSessionManager");
- _adminSessionManager = new AdminSessionManagerI(_database, sessionTimeout, regTopic, nodeTopic, this);
- adminAdapter->add(_adminSessionManager, adminSessionMgrId);
+ Identity clientSessionMgrId = _communicator->stringToIdentity(instanceName + "/SessionManager");
+ adminAdapter->add(new ClientSessionManagerI(_clientSessionFactory), clientSessionMgrId);
Identity sslClientSessionMgrId = _communicator->stringToIdentity(instanceName + "/SSLSessionManager");
- adminAdapter->add(new ClientSSLSessionManagerI(_database, sessionTimeout, _waitQueue), sslClientSessionMgrId);
+ adminAdapter->add(new ClientSSLSessionManagerI(_clientSessionFactory), sslClientSessionMgrId);
+
+ _adminSessionFactory = new AdminSessionFactory(adminAdapter, _database, sessionTimeout, regTopic, nodeTopic, this);
+
+ Identity adminSessionMgrId = _communicator->stringToIdentity(instanceName + "/AdminSessionManager");
+ adminAdapter->add(new AdminSessionManagerI(_adminSessionFactory), adminSessionMgrId);
Identity sslAdmSessionMgrId = _communicator->stringToIdentity(instanceName + "/AdminSSLSessionManager");
- AdminSSLSessionManagerIPtr ai = new AdminSSLSessionManagerI(_database, sessionTimeout, regTopic, nodeTopic, this);
- adminAdapter->add(ai, sslAdmSessionMgrId);
+ adminAdapter->add(new AdminSSLSessionManagerI(_adminSessionFactory), sslAdmSessionMgrId);
//
// Setup null permissions verifier object, client and admin permissions verifiers.
@@ -509,7 +510,7 @@ RegistryI::createSession(const string& user, const string& password, const Curre
throw exc;
}
- SessionIPtr session = _clientSessionManager->create(user, 0);
+ SessionIPtr session = _clientSessionFactory->createSessionServant(user, 0);
session->setServantLocator(_sessionServantLocator);
SessionPrx proxy = SessionPrx::uncheckedCast(_sessionServantLocator->add(session, current.con));
_clientReaper->add(new SessionReapable(current.adapter, session, proxy->ice_getIdentity()));
@@ -542,7 +543,7 @@ RegistryI::createAdminSession(const string& user, const string& password, const
throw exc;
}
- AdminSessionIPtr session = _adminSessionManager->create(user);
+ AdminSessionIPtr session = _adminSessionFactory->createSessionServant(user);
ObjectPrx admin = _sessionServantLocator->add(new AdminI(_database, this, session), current.con);
session->setAdmin(AdminPrx::uncheckedCast(admin));
session->setServantLocator(_sessionServantLocator);
@@ -586,7 +587,7 @@ RegistryI::createSessionFromSecureConnection(const Current& current)
throw exc;
}
- SessionIPtr session = _clientSessionManager->create(userDN, 0);
+ SessionIPtr session = _clientSessionFactory->createSessionServant(userDN, 0);
session->setServantLocator(_sessionServantLocator);
SessionPrx proxy = SessionPrx::uncheckedCast(_sessionServantLocator->add(session, current.con));
_clientReaper->add(new SessionReapable(current.adapter, session, proxy->ice_getIdentity()));
@@ -631,7 +632,7 @@ RegistryI::createAdminSessionFromSecureConnection(const Current& current)
//
// We let the connection access the administrative interface.
//
- AdminSessionIPtr session = _adminSessionManager->create(userDN);
+ AdminSessionIPtr session = _adminSessionFactory->createSessionServant(userDN);
ObjectPrx admin = _sessionServantLocator->add(new AdminI(_database, this, session), current.con);
session->setAdmin(AdminPrx::uncheckedCast(admin));
session->setServantLocator(_sessionServantLocator);
diff --git a/cpp/src/IceGrid/RegistryI.h b/cpp/src/IceGrid/RegistryI.h
index 0a82bcdf39c..b11b4060af7 100644
--- a/cpp/src/IceGrid/RegistryI.h
+++ b/cpp/src/IceGrid/RegistryI.h
@@ -33,11 +33,11 @@ typedef IceUtil::Handle<WaitQueue> WaitQueuePtr;
class SessionServantLocatorI;
typedef IceUtil::Handle<SessionServantLocatorI> SessionServantLocatorIPtr;
-class ClientSessionManagerI;
-typedef IceUtil::Handle<ClientSessionManagerI> ClientSessionManagerIPtr;
+class ClientSessionFactory;
+typedef IceUtil::Handle<ClientSessionFactory> ClientSessionFactoryPtr;
-class AdminSessionManagerI;
-typedef IceUtil::Handle<AdminSessionManagerI> AdminSessionManagerIPtr;
+class AdminSessionFactory;
+typedef IceUtil::Handle<AdminSessionFactory> AdminSessionFactoryPtr;
class RegistryI : public Registry
{
@@ -75,11 +75,11 @@ private:
WaitQueuePtr _waitQueue;
SessionServantLocatorIPtr _sessionServantLocator;
- ClientSessionManagerIPtr _clientSessionManager;
+ ClientSessionFactoryPtr _clientSessionFactory;
Glacier2::PermissionsVerifierPrx _clientVerifier;
Glacier2::SSLPermissionsVerifierPrx _sslClientVerifier;
- AdminSessionManagerIPtr _adminSessionManager;
+ AdminSessionFactoryPtr _adminSessionFactory;
Glacier2::PermissionsVerifierPrx _adminVerifier;
Glacier2::SSLPermissionsVerifierPrx _sslAdminVerifier;
diff --git a/cpp/src/IceGrid/ServerCache.cpp b/cpp/src/IceGrid/ServerCache.cpp
index 9a4aa545d95..6e469c52e38 100644
--- a/cpp/src/IceGrid/ServerCache.cpp
+++ b/cpp/src/IceGrid/ServerCache.cpp
@@ -15,6 +15,7 @@
#include <IceGrid/AdapterCache.h>
#include <IceGrid/ObjectCache.h>
#include <IceGrid/SessionI.h>
+#include <IceGrid/DescriptorHelper.h>
using namespace std;
using namespace IceGrid;
@@ -147,12 +148,6 @@ ServerCache::clear(const string& id)
CacheByString<ServerEntry>::removeImpl(id);
}
-NodeCache&
-ServerCache::getNodeCache() const
-{
- return _nodeCache;
-}
-
void
ServerCache::addCommunicator(const CommunicatorDescriptorPtr& comm, const ServerEntryPtr& server)
{
@@ -785,14 +780,16 @@ ServerEntry::allocated(const SessionIPtr& session)
out << "server `" << _id << "' allocated by `" << session->getId() << "' (" << _count << ")";
}
+ assert(_loaded.get() || _load.get());
+ ServerDescriptorPtr desc = _loaded.get() ? _loaded->descriptor : _load->descriptor;
+
//
// If the server has the session activation mode, we re-load the
// server on the node as its deployment might have changed (it's
// possible to use ${session.*} variable with server with the
// session activation mode.
//
- if(_loaded.get() && _loaded->descriptor->activation == "session" ||
- _load.get() && _load->descriptor->activation == "session")
+ if(desc->activation == "session")
{
_updated = true;
if(!_load.get())
@@ -807,14 +804,14 @@ ServerEntry::allocated(const SessionIPtr& session)
Glacier2::SessionControlPrx ctl = session->getSessionControl();
if(ctl)
{
+ ServerHelperPtr helper = createHelper(_cache.getCommunicator(), desc);
+ multiset<string> adapterIds;
+ multiset<Ice::Identity> identities;
+ helper->getIds(adapterIds, identities);
try
{
- Ice::StringSeq seq(_adapters.size());
- for(AdapterPrxDict::const_iterator p = _adapters.begin(); p != _adapters.end(); ++p)
- {
- seq.push_back(p->first);
- }
- ctl->adapterIds()->add(seq);
+ ctl->adapterIds()->add(Ice::StringSeq(adapterIds.begin(), adapterIds.end()));
+ ctl->identities()->add(Ice::IdentitySeq(identities.begin(), identities.end()));
}
catch(const Ice::ObjectNotExistException&)
{
@@ -825,6 +822,9 @@ ServerEntry::allocated(const SessionIPtr& session)
void
ServerEntry::released(const SessionIPtr& session)
{
+ assert(_loaded.get() || _load.get());
+ ServerDescriptorPtr desc = _loaded.get() ? _loaded->descriptor : _load->descriptor;
+
//
// If the server has the session activation mode, we re-load the
// server on the node as its deployment might have changed (it's
@@ -832,8 +832,7 @@ ServerEntry::released(const SessionIPtr& session)
// session activation mode. Synchronizing the server will also
// shutdown the server on the node.
//
- if(_loaded.get() && _loaded->descriptor->activation == "session" ||
- _load.get() && _load->descriptor->activation == "session")
+ if(desc->activation == "session")
{
_updated = true;
if(!_load.get())
@@ -848,14 +847,14 @@ ServerEntry::released(const SessionIPtr& session)
Glacier2::SessionControlPrx ctl = session->getSessionControl();
if(ctl)
{
+ ServerHelperPtr helper = createHelper(_cache.getCommunicator(), desc);
+ multiset<string> adapterIds;
+ multiset<Ice::Identity> identities;
+ helper->getIds(adapterIds, identities);
try
{
- Ice::StringSeq seq(_adapters.size());
- for(AdapterPrxDict::const_iterator p = _adapters.begin(); p != _adapters.end(); ++p)
- {
- seq.push_back(p->first);
- }
- ctl->adapterIds()->remove(seq);
+ ctl->adapterIds()->remove(Ice::StringSeq(adapterIds.begin(), adapterIds.end()));
+ ctl->identities()->remove(Ice::IdentitySeq(identities.begin(), identities.end()));
}
catch(const Ice::ObjectNotExistException&)
{
diff --git a/cpp/src/IceGrid/ServerCache.h b/cpp/src/IceGrid/ServerCache.h
index e4ed456dd21..47837584468 100644
--- a/cpp/src/IceGrid/ServerCache.h
+++ b/cpp/src/IceGrid/ServerCache.h
@@ -95,7 +95,8 @@ public:
void clear(const std::string&);
- NodeCache& getNodeCache() const;
+ NodeCache& getNodeCache() const { return _nodeCache; }
+ Ice::CommunicatorPtr getCommunicator() const { return _communicator; }
private:
diff --git a/cpp/src/IceGrid/SessionI.cpp b/cpp/src/IceGrid/SessionI.cpp
index 068ec868515..c339d7b9499 100644
--- a/cpp/src/IceGrid/SessionI.cpp
+++ b/cpp/src/IceGrid/SessionI.cpp
@@ -289,7 +289,11 @@ SessionI::removeAllocation(const AllocatablePtr& allocatable)
_allocations.erase(allocatable);
}
-ClientSessionManagerI::ClientSessionManagerI(const DatabasePtr& database, int timeout, const WaitQueuePtr& waitQueue) :
+ClientSessionFactory::ClientSessionFactory(const Ice::ObjectAdapterPtr& adapter,
+ const DatabasePtr& database,
+ int timeout,
+ const WaitQueuePtr& waitQueue) :
+ _adapter(adapter),
_database(database),
_timeout(timeout),
_waitQueue(waitQueue)
@@ -297,28 +301,27 @@ ClientSessionManagerI::ClientSessionManagerI(const DatabasePtr& database, int ti
}
Glacier2::SessionPrx
-ClientSessionManagerI::create(const string& user, const Glacier2::SessionControlPrx& ctl, const Ice::Current& current)
+ClientSessionFactory::createGlacier2Session(const string& sessionId, const Glacier2::SessionControlPrx& ctl)
{
+ Ice::IdentitySeq ids; // Identities of the object the session is allowed to access.
+
Ice::Identity id;
+ id.category = _database->getInstanceName();
+
+ // The session object
id.name = IceUtil::generateUUID();
- id.category = current.id.category;
- Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(current.adapter->add(create(user, ctl), id));
+ ids.push_back(id);
+ SessionIPtr session = createSessionServant(sessionId, ctl);
+ Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(_adapter->add(session, id));
+
+ // The IceGrid::Query object
+ id.name = "Query";
+ ids.push_back(id);
+
if(ctl)
{
try
{
- //
- // Restrict the objects the session is allowed to access to the session object itself,
- // the query and registry objects.
- //
- Ice::IdentitySeq ids;
- Ice::Identity id;
- id.category = "IceGrid";
- id.name = "Query";
- ids.push_back(id);
- id.name = "Registry";
- ids.push_back(id);
- ids.push_back(s->ice_getIdentity());
ctl->identities()->add(ids);
}
catch(const Ice::LocalException&)
@@ -327,19 +330,33 @@ ClientSessionManagerI::create(const string& user, const Glacier2::SessionControl
return 0;
}
}
+
return s;
}
SessionIPtr
-ClientSessionManagerI::create(const string& userId, const Glacier2::SessionControlPrx& ctl)
+ClientSessionFactory::createSessionServant(const string& userId, const Glacier2::SessionControlPrx& ctl)
{
return new SessionI(userId, _database, _timeout, _waitQueue, ctl);
}
-ClientSSLSessionManagerI::ClientSSLSessionManagerI(const DatabasePtr& db, int timeout, const WaitQueuePtr& waitQueue) :
- _database(db),
- _timeout(timeout),
- _waitQueue(waitQueue)
+const TraceLevelsPtr&
+ClientSessionFactory::getTraceLevels() const
+{
+ return _database->getTraceLevels();
+}
+
+ClientSessionManagerI::ClientSessionManagerI(const ClientSessionFactoryPtr& factory) : _factory(factory)
+{
+}
+
+Glacier2::SessionPrx
+ClientSessionManagerI::create(const string& user, const Glacier2::SessionControlPrx& ctl, const Ice::Current& current)
+{
+ return _factory->createGlacier2Session(user, ctl);
+}
+
+ClientSSLSessionManagerI::ClientSSLSessionManagerI(const ClientSessionFactoryPtr& factory) : _factory(factory)
{
}
@@ -358,40 +375,12 @@ ClientSSLSessionManagerI::create(const Glacier2::SSLInfo& info, const Glacier2::
catch(const Ice::Exception& ex)
{
// This shouldn't happen, the SSLInfo is supposed to be encoded by Glacier2.
- Ice::Error out(_database->getTraceLevels()->logger);
+ Ice::Error out(_factory->getTraceLevels()->logger);
out << "SSL session manager couldn't decode SSL certificates:\n" << ex;
return 0;
}
}
- SessionIPtr session = new SessionI(userDN, _database, _timeout, _waitQueue, ctl);
- Ice::Identity id;
- id.name = IceUtil::generateUUID();
- id.category = current.id.category;
- Glacier2::SessionPrx s = Glacier2::SessionPrx::uncheckedCast(current.adapter->add(session, id));
- if(ctl)
- {
- try
- {
- //
- // Restrict the objects the session is allowed to access to the session object itself,
- // the query and registry objects.
- //
- Ice::IdentitySeq ids;
- Ice::Identity id;
- id.category = "IceGrid";
- id.name = "Query";
- ids.push_back(id);
- id.name = "Registry";
- ids.push_back(id);
- ids.push_back(s->ice_getIdentity());
- ctl->identities()->add(ids);
- }
- catch(const Ice::LocalException&)
- {
- s->destroy();
- return 0;
- }
- }
- return s;
+ return _factory->createGlacier2Session(userDN, ctl);
}
+
diff --git a/cpp/src/IceGrid/SessionI.h b/cpp/src/IceGrid/SessionI.h
index 21f0bad52e6..9285ab02b1b 100644
--- a/cpp/src/IceGrid/SessionI.h
+++ b/cpp/src/IceGrid/SessionI.h
@@ -105,40 +105,52 @@ protected:
std::set<AllocatablePtr> _allocations;
};
-class ClientSessionManagerI : virtual public Glacier2::SessionManager
+class ClientSessionFactory : virtual public IceUtil::Shared
{
public:
- ClientSessionManagerI(const DatabasePtr&, int, const WaitQueuePtr&);
-
- virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&);
+ ClientSessionFactory(const Ice::ObjectAdapterPtr&, const DatabasePtr&, int, const WaitQueuePtr&);
- SessionIPtr create(const std::string&, const Glacier2::SessionControlPrx&);
+ Glacier2::SessionPrx createGlacier2Session(const std::string&, const Glacier2::SessionControlPrx&);
+ SessionIPtr createSessionServant(const std::string&, const Glacier2::SessionControlPrx&);
+
+ const TraceLevelsPtr& getTraceLevels() const;
private:
+ const Ice::ObjectAdapterPtr _adapter;
const DatabasePtr _database;
const int _timeout;
const WaitQueuePtr _waitQueue;
};
-typedef IceUtil::Handle<ClientSessionManagerI> ClientSessionManagerIPtr;
+typedef IceUtil::Handle<ClientSessionFactory> ClientSessionFactoryPtr;
+
+class ClientSessionManagerI : virtual public Glacier2::SessionManager
+{
+public:
+
+ ClientSessionManagerI(const ClientSessionFactoryPtr&);
+
+ virtual Glacier2::SessionPrx create(const std::string&, const Glacier2::SessionControlPrx&, const Ice::Current&);
+
+private:
+
+ const ClientSessionFactoryPtr _factory;
+};
class ClientSSLSessionManagerI : virtual public Glacier2::SSLSessionManager
{
public:
- ClientSSLSessionManagerI(const DatabasePtr&, int, const WaitQueuePtr&);
+ ClientSSLSessionManagerI(const ClientSessionFactoryPtr&);
virtual Glacier2::SessionPrx create(const Glacier2::SSLInfo&, const Glacier2::SessionControlPrx&,
const Ice::Current&);
private:
- const DatabasePtr _database;
- const int _timeout;
- const WaitQueuePtr _waitQueue;
+ const ClientSessionFactoryPtr _factory;
};
-typedef IceUtil::Handle<ClientSSLSessionManagerI> ClientSSLSessionManagerIPtr;
};