summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IceGrid/DescriptorHelper.cpp38
-rw-r--r--cpp/src/IceGrid/Internal.ice2
-rw-r--r--cpp/src/IceGrid/NodeI.cpp4
-rw-r--r--cpp/src/IceGrid/Parser.cpp4
-rw-r--r--cpp/src/IceGrid/ServerI.cpp31
-rw-r--r--cpp/src/IceGrid/ServerI.h6
6 files changed, 65 insertions, 20 deletions
diff --git a/cpp/src/IceGrid/DescriptorHelper.cpp b/cpp/src/IceGrid/DescriptorHelper.cpp
index 32b396fc0ee..18398e16d17 100644
--- a/cpp/src/IceGrid/DescriptorHelper.cpp
+++ b/cpp/src/IceGrid/DescriptorHelper.cpp
@@ -1359,13 +1359,13 @@ ServerDescriptorHelper::ServerDescriptorHelper(const DescriptorHelper& helper, c
_descriptor->exe = attributes("exe");
}
_descriptor->interpreter = interpreter;
- _descriptor->activationTimeout = attributes.asInt("activation-timeout", "0");
- _descriptor->deactivationTimeout = attributes.asInt("deactivation-timeout", "0");
+ _descriptor->activationTimeout = attributes("activation-timeout", "0");
+ _descriptor->deactivationTimeout = attributes("deactivation-timeout", "0");
ComponentDescriptorHelper::init(_descriptor, attrs);
_descriptor->pwd = attributes("pwd", "");
- _descriptor->activation = (attributes("activation", "manual") == "on-demand") ? OnDemand : Manual;
+ _descriptor->activation = attributes("activation", "manual");
if(interpreter == "icebox" || interpreter == "java-icebox")
{
@@ -1646,6 +1646,38 @@ ServerDescriptorHelper::instantiateImpl(const ServerDescriptorPtr& desc, set<str
substitute(desc->exe);
substitute(desc->pwd);
+ substitute(desc->activation);
+ if(!desc->activation.empty() && desc->activation != "manual" && desc->activation != "on-demand")
+ {
+ DeploymentException ex;
+ ex.reason = "invalid server `" + desc->name + "': unknown activation `" + desc->activation + "'";
+ throw ex;
+ }
+ substitute(desc->activationTimeout);
+ if(!desc->activationTimeout.empty())
+ {
+ int value;
+ istringstream v(desc->activationTimeout);
+ if(!(v >> value))
+ {
+ DeploymentException ex;
+ ex.reason = "invalid server `" + desc->name + "': activation timeout is not an integer value";
+ throw ex;
+ }
+ }
+ substitute(desc->deactivationTimeout);
+ if(!desc->deactivationTimeout.empty())
+ {
+ int value;
+ istringstream v(desc->deactivationTimeout);
+ if(!(v >> value))
+ {
+ DeploymentException ex;
+ ex.reason = "invalid server `" + desc->name + "': deactivation timeout is not an integer value";
+ throw ex;
+ }
+ }
+
for_each(desc->options.begin(), desc->options.end(), substitute);
for_each(desc->envs.begin(), desc->envs.end(), substitute);
substitute(desc->interpreter);
diff --git a/cpp/src/IceGrid/Internal.ice b/cpp/src/IceGrid/Internal.ice
index e368854ba6e..56ae9960be8 100644
--- a/cpp/src/IceGrid/Internal.ice
+++ b/cpp/src/IceGrid/Internal.ice
@@ -107,7 +107,7 @@ interface Server
* Load the server.
*
**/
- void load(ServerDescriptor desc, out StringAdapterPrxDict adapters)
+ void load(ServerDescriptor desc, out StringAdapterPrxDict adapters, out int actTimeout, out int deactTimeout)
throws DeploymentException;
/**
diff --git a/cpp/src/IceGrid/NodeI.cpp b/cpp/src/IceGrid/NodeI.cpp
index 718afd6031b..92f63823d8d 100644
--- a/cpp/src/IceGrid/NodeI.cpp
+++ b/cpp/src/IceGrid/NodeI.cpp
@@ -66,9 +66,7 @@ NodeI::loadServer(const ServerDescriptorPtr& desc,
servant = new ServerI(this, proxy, _serversDir, desc->name, _waitTime);
current.adapter->add(servant, id);
}
- activationTimeout = desc->activationTimeout > 0 ? desc->activationTimeout : _waitTime;
- deactivationTimeout = desc->deactivationTimeout > 0 ? desc->deactivationTimeout : _waitTime;
- proxy->load(desc, adapters);
+ proxy->load(desc, adapters, activationTimeout, deactivationTimeout);
return proxy;
}
diff --git a/cpp/src/IceGrid/Parser.cpp b/cpp/src/IceGrid/Parser.cpp
index 2412dc974b4..7a44e8504a7 100644
--- a/cpp/src/IceGrid/Parser.cpp
+++ b/cpp/src/IceGrid/Parser.cpp
@@ -179,11 +179,11 @@ describeServer(Output& out, const Ice::CommunicatorPtr& communicator, const Serv
out << nl << "pwd = '" << server->pwd << "'";
}
out << nl << "activation = '" << server->activation << "'";
- if(server->activationTimeout > 0)
+ if(!server->activationTimeout.empty() && server->activationTimeout != "0")
{
out << nl << "activationTimeout = " << server->activationTimeout;
}
- if(server->deactivationTimeout > 0)
+ if(!server->deactivationTimeout.empty() && server->deactivationTimeout != "0")
{
out << nl << "deactivationTimeout = " << server->deactivationTimeout;
}
diff --git a/cpp/src/IceGrid/ServerI.cpp b/cpp/src/IceGrid/ServerI.cpp
index 0c8d293df6a..724d2e6da1f 100644
--- a/cpp/src/IceGrid/ServerI.cpp
+++ b/cpp/src/IceGrid/ServerI.cpp
@@ -83,7 +83,8 @@ ServerI::~ServerI()
}
void
-ServerI::load(const ServerDescriptorPtr& descriptor, StringAdapterPrxDict& adapters, const Ice::Current& current)
+ServerI::load(const ServerDescriptorPtr& descriptor, StringAdapterPrxDict& adapters, int& activationTimeout,
+ int& deactivationTimeout, const Ice::Current& current)
{
while(true)
{
@@ -102,7 +103,7 @@ ServerI::load(const ServerDescriptorPtr& descriptor, StringAdapterPrxDict& adapt
//
try
{
- update(descriptor, adapters, current);
+ update(descriptor, adapters, activationTimeout, deactivationTimeout, current);
}
catch(const string& msg)
{
@@ -499,8 +500,7 @@ ServerI::startInternal(ServerActivation act, const AMD_Server_startPtr& amdCB)
else
{
Lock sync(*this);
- int timeout = _desc->activationTimeout > 0 ? _desc->activationTimeout : _waitTime;
- _node->getWaitQueue()->add(new WaitForActivationItem(this), IceUtil::Time::seconds(timeout));
+ _node->getWaitQueue()->add(new WaitForActivationItem(this), IceUtil::Time::seconds(_activationTimeout));
setStateNoSync(ServerI::WaitForActivation);
checkActivation();
notifyAll();
@@ -705,8 +705,7 @@ ServerI::stopInternal(bool kill, const Ice::Current& current)
//
// Wait for a notification.
//
- int timeout = _desc->deactivationTimeout > 0 ? _desc->deactivationTimeout : _waitTime;
- bool notify = timedWait(IceUtil::Time::seconds(timeout));
+ bool notify = timedWait(IceUtil::Time::seconds(_deactivationTimeout));
if(!notify)
{
assert(oldState == _state);
@@ -840,12 +839,26 @@ ServerI::setStateNoSync(InternalServerState st)
}
void
-ServerI::update(const ServerDescriptorPtr& descriptor, StringAdapterPrxDict& adapters, const Ice::Current& current)
+ServerI::update(const ServerDescriptorPtr& descriptor, StringAdapterPrxDict& adapters, int& activationTimeout,
+ int& deactivationTimeout, const Ice::Current& current)
{
_desc = descriptor;
_serverDir = _serversDir + "/" + descriptor->name;
- _activation = descriptor->activation;
-
+ _activation = descriptor->activation == "on-demand" ? OnDemand : Manual;
+
+ istringstream at(_desc->activationTimeout);
+ if(!(at >> _activationTimeout) || !at.eof() || _activationTimeout == 0)
+ {
+ _activationTimeout = _waitTime;
+ }
+ istringstream dt(_desc->deactivationTimeout);
+ if(!(dt >> _deactivationTimeout) || !dt.eof() || _deactivationTimeout == 0)
+ {
+ _deactivationTimeout = _waitTime;
+ }
+ activationTimeout = _activationTimeout;
+ deactivationTimeout = _deactivationTimeout;
+
//
// Make sure the server directories exists.
//
diff --git a/cpp/src/IceGrid/ServerI.h b/cpp/src/IceGrid/ServerI.h
index fbf5cbef083..71120cd7ae7 100644
--- a/cpp/src/IceGrid/ServerI.h
+++ b/cpp/src/IceGrid/ServerI.h
@@ -43,7 +43,7 @@ public:
ServerI(const NodeIPtr&, const ServerPrx&, const std::string&, const std::string&, int);
virtual ~ServerI();
- virtual void load(const ServerDescriptorPtr&, StringAdapterPrxDict&, const Ice::Current&);
+ virtual void load(const ServerDescriptorPtr&, StringAdapterPrxDict&, int&, int&, const Ice::Current&);
virtual void start_async(const AMD_Server_startPtr&, const ::Ice::Current&);
virtual void stop(const ::Ice::Current&);
virtual void sendSignal(const std::string&, const ::Ice::Current&);
@@ -72,7 +72,7 @@ private:
void setState(InternalServerState);
void setStateNoSync(InternalServerState);
- void update(const ServerDescriptorPtr&, StringAdapterPrxDict&, const Ice::Current&);
+ void update(const ServerDescriptorPtr&, StringAdapterPrxDict&, int&, int&, const Ice::Current&);
AdapterPrx addAdapter(const AdapterDescriptor&, const Ice::Current&);
void updateConfigFile(const std::string&, const ComponentDescriptorPtr&);
void updateDbEnv(const std::string&, const DbEnvDescriptor&);
@@ -89,6 +89,8 @@ private:
ServerDescriptorPtr _desc;
InternalServerState _state;
ServerActivation _activation;
+ int _activationTimeout;
+ int _deactivationTimeout;
std::map<std::string, ServerAdapterIPtr> _adapters;
bool _processRegistered;
Ice::ProcessPrx _process;