summaryrefslogtreecommitdiff
path: root/cpp/src/IceGrid/NodeCache.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2005-10-04 15:49:11 +0000
committerBenoit Foucher <benoit@zeroc.com>2005-10-04 15:49:11 +0000
commitf3b88e3177de83300b4b096e9710fd3f86d74a66 (patch)
treefcad236aeb0b95ed2e1825a1751d2663a9ccf968 /cpp/src/IceGrid/NodeCache.cpp
parent- Modified VC 6 build command so the packaging scripts won't attempt to (diff)
downloadice-f3b88e3177de83300b4b096e9710fd3f86d74a66.tar.bz2
ice-f3b88e3177de83300b4b096e9710fd3f86d74a66.tar.xz
ice-f3b88e3177de83300b4b096e9710fd3f86d74a66.zip
Distribution improvments, bug fixes, code cleanup.
Diffstat (limited to 'cpp/src/IceGrid/NodeCache.cpp')
-rw-r--r--cpp/src/IceGrid/NodeCache.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/cpp/src/IceGrid/NodeCache.cpp b/cpp/src/IceGrid/NodeCache.cpp
index 0b59a2106d2..94c17d3ae39 100644
--- a/cpp/src/IceGrid/NodeCache.cpp
+++ b/cpp/src/IceGrid/NodeCache.cpp
@@ -12,6 +12,7 @@
#include <IceGrid/NodeCache.h>
#include <IceGrid/NodeSessionI.h>
#include <IceGrid/ServerCache.h>
+#include <IceGrid/DescriptorHelper.h>
using namespace std;
using namespace IceGrid;
@@ -214,3 +215,157 @@ NodeEntry::canRemove()
Lock sync(*this);
return !_session && _servers.empty();
}
+
+ServerPrx
+NodeEntry::loadServer(const ServerInfo& server, AdapterPrxDict& adapters, int& aTimeout, int& dTimeout)
+{
+ NodePrx node;
+ ServerDescriptorPtr desc;
+ {
+ Lock sync(*this);
+ if(!_session)
+ {
+ throw NodeUnreachableException(_name, "the node is not active");
+ }
+ node = _session->getNode();
+ desc = getServerDescriptor(server);
+ }
+ assert(desc);
+ try
+ {
+ ServerPrx proxy = node->loadServer(server.application, desc, adapters, aTimeout, dTimeout);
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 1)
+ {
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "loaded server `" << desc->id << "' on node `" << _name << "'";
+ }
+ return ServerPrx::uncheckedCast(proxy->ice_collocationOptimization(false));
+ }
+ catch(const NodeNotExistException& ex)
+ {
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 1)
+ {
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "couldn't load `" << desc->id << "' on node `" << _name << "':\n" << ex;
+ }
+
+ ostringstream os;
+ os << ex;
+ throw NodeUnreachableException(_name, os.str());
+ }
+ catch(const DeploymentException& ex)
+ {
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 1)
+ {
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "couldn't load `" << desc->id << "' on node `" << _name << "':\n" << ex.reason;
+ }
+
+ Ice::Warning out(_cache.getTraceLevels()->logger);
+ out << "failed to load `" + desc->id + "' on node `" << _name << "':\n" << ex;
+ ostringstream os;
+ os << ex << "\nreason: " << ex.reason;
+ throw NodeUnreachableException(_name, os.str());
+ }
+ catch(const Ice::Exception& ex)
+ {
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 1)
+ {
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "couldn't load server `" << desc->id << "' on node `" << _name << "':\n" << ex;
+ }
+
+ ostringstream os;
+ os << ex;
+ throw NodeUnreachableException(_name, os.str());
+ }
+}
+
+void
+NodeEntry::destroyServer(const string& id)
+{
+ try
+ {
+ getProxy()->destroyServer(id);
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 1)
+ {
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "unloaded server `" << id << "' on node `" << _name << "'";
+ }
+ }
+ catch(const NodeNotExistException& ex)
+ {
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 1)
+ {
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "couldn't unload server `" << id << "' on node `" << _name << "':\n" << ex;
+ }
+
+ ostringstream os;
+ os << ex;
+ throw NodeUnreachableException(_name, os.str());
+ }
+ catch(const Ice::LocalException& ex)
+ {
+ if(_cache.getTraceLevels() && _cache.getTraceLevels()->server > 1)
+ {
+ Ice::Trace out(_cache.getTraceLevels()->logger, _cache.getTraceLevels()->serverCat);
+ out << "couldn't unload server `" << id << "' on node `" << _name << "':\n" << ex;
+ }
+
+ ostringstream os;
+ os << ex;
+ throw NodeUnreachableException(_name, os.str());
+ }
+}
+
+ServerInfo
+NodeEntry::getServerInfo(const ServerInfo& server)
+{
+ Lock sync(*this);
+ if(!_session)
+ {
+ throw NodeUnreachableException(_name, "the node is not active");
+ }
+ ServerInfo info = server;
+ info.descriptor = getServerDescriptor(server);
+ assert(info.descriptor);
+ return info;
+}
+
+ServerDescriptorPtr
+NodeEntry::getServerDescriptor(const ServerInfo& server)
+{
+ 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);
+
+ IceBoxDescriptorPtr iceBox = IceBoxDescriptorPtr::dynamicCast(server.descriptor);
+ if(iceBox)
+ {
+ return IceBoxHelper(iceBox).instantiate(resolve);
+ }
+ else
+ {
+ return ServerHelper(server.descriptor).instantiate(resolve);
+ }
+ }
+ catch(const DeploymentException& ex)
+ {
+ Ice::Warning out(_cache.getTraceLevels()->logger);
+ out << "couldn't instantiate `" + server.descriptor->id + "':\n" << ex.reason;
+ return server.descriptor;
+ }
+}