summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/NodeCache.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2006-05-17 12:27:58 +0000
committerBenoit Foucher <benoit@zeroc.com>2006-05-17 12:27:58 +0000
commite52e31abbe3878540a3d79aec167fb24fe73de8e (patch)
tree4dbd775cf9c3102c2c673ed3d03aa5653ea42408 /cpp/src/IceGrid/NodeCache.cpp
parentFixed bug 997 (diff)
downloadice-e52e31abbe3878540a3d79aec167fb24fe73de8e.tar.bz2
ice-e52e31abbe3878540a3d79aec167fb24fe73de8e.tar.xz
ice-e52e31abbe3878540a3d79aec167fb24fe73de8e.zip
More work on session activation.
Diffstat (limited to 'cpp/src/IceGrid/NodeCache.cpp')
-rw-r--r--cpp/src/IceGrid/NodeCache.cpp122
1 files changed, 73 insertions, 49 deletions
diff --git a/cpp/src/IceGrid/NodeCache.cpp b/cpp/src/IceGrid/NodeCache.cpp
index f30af04da87..33615b68d65 100644
--- a/cpp/src/IceGrid/NodeCache.cpp
+++ b/cpp/src/IceGrid/NodeCache.cpp
@@ -10,6 +10,7 @@
#include <IceUtil/Functional.h>
#include <Ice/LoggerUtil.h>
#include <IceGrid/NodeCache.h>
+#include <IceGrid/SessionI.h>
#include <IceGrid/NodeSessionI.h>
#include <IceGrid/ServerCache.h>
#include <IceGrid/DescriptorHelper.h>
@@ -375,30 +376,58 @@ NodeEntry::canRemove()
}
void
-NodeEntry::loadServer(const ServerEntryPtr& entry, const ServerInfo& server)
+NodeEntry::loadServer(const ServerEntryPtr& entry, const ServerInfo& server, const SessionIPtr& session)
{
- NodePrx node;
- ServerDescriptorPtr desc;
+ try
{
- Lock sync(*this);
- if(!_session)
+ NodePrx node;
+ ServerDescriptorPtr desc;
+ {
+ Lock sync(*this);
+ if(!_session)
+ {
+ throw NodeUnreachableException(_name, "the node is not active");
+ }
+ node = _session->getNode();
+ try
+ {
+ desc = getServerDescriptor(server, session);
+ }
+ catch(const DeploymentException&)
+ {
+ //
+ // We ignore the deployment error for now (which can
+ // only be caused in theory by session variables not
+ // being defined because the server isn't
+ // allocated...)
+ //
+ // TODO: Once we have node-bound & not node-bound
+ // servers, we shouldn't ignore errors anymore
+ // (session servers will only be bound to the node if
+ // they are allocated by a session).
+ //
+ desc = server.descriptor;
+ }
+ }
+ assert(desc);
+
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 2)
{
- entry->exception(NodeUnreachableException(_name, "the node is not active"));
- return;
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "loading `" << desc->id << "' on node `" << _name << "'";
+ if(session)
+ {
+ out << " for session `" << session->getUserId() << "'";
+ }
}
- node = _session->getNode();
- desc = getServerDescriptor(server);
+
+ AMI_Node_loadServerPtr amiCB = new LoadCB(_cache.getTraceLevels(), entry, entry->getId(), _name);
+ node->loadServer_async(amiCB, server.application, desc, session ? session->getUserId() : "");
}
- assert(desc);
-
- if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 2)
+ catch(const NodeUnreachableException& ex)
{
- Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
- out << "loading `" << desc->id << "' on node `" << _name << "'";
+ entry->exception(ex);
}
-
- AMI_Node_loadServerPtr amiCB = new LoadCB(_cache.getTraceLevels(), entry, desc->id, _name);
- node->loadServer_async(amiCB, server.application, desc);
}
void
@@ -417,12 +446,11 @@ NodeEntry::destroyServer(const ServerEntryPtr& entry, const string& id)
catch(const NodeUnreachableException& ex)
{
entry->exception(ex);
- return;
}
}
ServerInfo
-NodeEntry::getServerInfo(const ServerInfo& server)
+NodeEntry::getServerInfo(const ServerInfo& server, const SessionIPtr& session)
{
Lock sync(*this);
if(!_session)
@@ -430,45 +458,41 @@ NodeEntry::getServerInfo(const ServerInfo& server)
throw NodeUnreachableException(_name, "the node is not active");
}
ServerInfo info = server;
- info.descriptor = getServerDescriptor(server);
+ info.descriptor = getServerDescriptor(server, session);
assert(info.descriptor);
return info;
}
ServerDescriptorPtr
-NodeEntry::getServerDescriptor(const ServerInfo& server)
+NodeEntry::getServerDescriptor(const ServerInfo& server, const SessionIPtr& session)
{
assert(_session);
- try
+
+ NodeInfo info = _session->getInfo();
+
+ Resolver resolve("server `" + server.descriptor->id + "'", map<string, string>());
+ resolve.setReserved("application", server.application);
+ resolve.setReserved("node", server.node);
+ resolve.setReserved("server", server.descriptor->id);
+ resolve.setReserved("node.os", info.os);
+ resolve.setReserved("node.hostname", info.hostname);
+ resolve.setReserved("node.release", info.release);
+ resolve.setReserved("node.version", info.version);
+ resolve.setReserved("node.machine", info.machine);
+ resolve.setReserved("node.datadir", info.dataDir);
+
+ if(session)
{
- NodeInfo info = _session->getInfo();
-
- Resolver resolve("server `" + server.descriptor->id + "'", map<string, string>());
- resolve.setReserved("application", server.application);
- resolve.setReserved("node", server.node);
- resolve.setReserved("server", server.descriptor->id);
- resolve.setReserved("node.os", info.os);
- resolve.setReserved("node.hostname", info.hostname);
- resolve.setReserved("node.release", info.release);
- resolve.setReserved("node.version", info.version);
- resolve.setReserved("node.machine", info.machine);
- resolve.setReserved("node.datadir", info.dataDir);
-
- IceBoxDescriptorPtr iceBox = IceBoxDescriptorPtr::dynamicCast(server.descriptor);
- if(iceBox)
- {
- return IceBoxHelper(_cache.getCommunicator(), iceBox).instantiate(resolve, PropertySetDescriptor());
- }
- else
- {
- return ServerHelper(_cache.getCommunicator(), server.descriptor).instantiate(resolve,
- PropertySetDescriptor());
- }
+ resolve.setReserved("session.userid", session->getUserId());
}
- catch(const DeploymentException& ex)
+
+ IceBoxDescriptorPtr iceBox = IceBoxDescriptorPtr::dynamicCast(server.descriptor);
+ if(iceBox)
+ {
+ return IceBoxHelper(_cache.getCommunicator(), iceBox).instantiate(resolve, PropertySetDescriptor());
+ }
+ else
{
- Ice::Warning out(_cache.getTraceLevels()->logger);
- out << "couldn't instantiate `" + server.descriptor->id + "':\n" << ex.reason;
- return server.descriptor;
+ return ServerHelper(_cache.getCommunicator(), server.descriptor).instantiate(resolve, PropertySetDescriptor());
}
}