summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IceGrid/Activator.cpp12
-rw-r--r--cpp/src/IceGrid/Activator.h2
-rw-r--r--cpp/src/IceGrid/AdminI.cpp7
-rw-r--r--cpp/src/IceGrid/AdminI.h2
-rw-r--r--cpp/src/IceGrid/Internal.ice3
-rw-r--r--cpp/src/IceGrid/Parser.cpp9
-rw-r--r--cpp/src/IceGrid/ServerI.cpp82
-rw-r--r--cpp/src/IceGrid/ServerI.h4
8 files changed, 73 insertions, 48 deletions
diff --git a/cpp/src/IceGrid/Activator.cpp b/cpp/src/IceGrid/Activator.cpp
index 0f81fd3f3fc..143164c8c13 100644
--- a/cpp/src/IceGrid/Activator.cpp
+++ b/cpp/src/IceGrid/Activator.cpp
@@ -329,7 +329,7 @@ Activator::~Activator()
#endif
}
-bool
+void
Activator::activate(const string& name,
const string& exePath,
const string& pwdPath,
@@ -341,13 +341,13 @@ Activator::activate(const string& name,
if(_deactivating)
{
- return false;
+ throw string("The node is being shutdown.");
}
string path = exePath;
if(path.empty())
{
- return false;
+ throw string("The server executable path is empty.");
}
string pwd = IcePatch2::simplify(pwdPath);
@@ -366,7 +366,7 @@ Activator::activate(const string& name,
{
Error out(_traceLevels->logger);
out << "cannot convert `" << path << "' into an absolute path";
- return false;
+ throw string("The server executable path `" + path + "' can't be converted into an absolute path.");
}
path = absbuf;
}
@@ -386,7 +386,7 @@ Activator::activate(const string& name,
{
Error out(_traceLevels->logger);
out << "cannot convert `" << pwd << "' into an absolute path";
- return false;
+ throw string("The server working directory path `" + pwd + "' can't be converted into an absolute path.");
}
pwd = absbuf;
}
@@ -716,8 +716,6 @@ Activator::activate(const string& name,
}
}
#endif
-
- return true;
}
void
diff --git a/cpp/src/IceGrid/Activator.h b/cpp/src/IceGrid/Activator.h
index 3a7bbcd59f6..1d4c3e250e4 100644
--- a/cpp/src/IceGrid/Activator.h
+++ b/cpp/src/IceGrid/Activator.h
@@ -26,7 +26,7 @@ public:
Activator(const TraceLevelsPtr&, const Ice::PropertiesPtr&);
virtual ~Activator();
- virtual bool activate(const std::string&, const std::string&, const std::string&, const Ice::StringSeq&,
+ virtual void activate(const std::string&, const std::string&, const std::string&, const Ice::StringSeq&,
const Ice::StringSeq&, const ServerPrx&);
virtual void deactivate(const std::string&, const Ice::ProcessPrx&);
virtual void kill(const std::string&);
diff --git a/cpp/src/IceGrid/AdminI.cpp b/cpp/src/IceGrid/AdminI.cpp
index e7425b33e8e..b17a9d3d438 100644
--- a/cpp/src/IceGrid/AdminI.cpp
+++ b/cpp/src/IceGrid/AdminI.cpp
@@ -245,7 +245,7 @@ AdminI::getServerPid(const string& id, const Current&) const
}
}
-bool
+void
AdminI::startServer(const string& id, const Current&)
{
ServerProxyWrapper proxy(_database, id);
@@ -254,15 +254,14 @@ AdminI::startServer(const string& id, const Current&)
{
return proxy->start();
}
- catch(const Ice::TimeoutException&)
+ catch(const ServerStartException&)
{
- return false; // TODO: better exception?
+ throw;
}
catch(const Ice::Exception& ex)
{
proxy.handleException(ex);
}
- return true;
}
void
diff --git a/cpp/src/IceGrid/AdminI.h b/cpp/src/IceGrid/AdminI.h
index 7dfb28235d4..b72ba6a4208 100644
--- a/cpp/src/IceGrid/AdminI.h
+++ b/cpp/src/IceGrid/AdminI.h
@@ -40,7 +40,7 @@ public:
virtual ServerInfo getServerInfo(const ::std::string&, const Ice::Current&) const;
virtual ServerState getServerState(const ::std::string&, const Ice::Current&) const;
virtual Ice::Int getServerPid(const ::std::string&, const Ice::Current&) const;
- virtual bool startServer(const ::std::string&, const Ice::Current&);
+ virtual void startServer(const ::std::string&, const Ice::Current&);
virtual void stopServer(const ::std::string&, const Ice::Current&);
virtual void patchServer(const ::std::string&, bool, const Ice::Current&);
virtual void sendSignal(const ::std::string&, const ::std::string&, const Ice::Current&);
diff --git a/cpp/src/IceGrid/Internal.ice b/cpp/src/IceGrid/Internal.ice
index d63a54e2a9b..b3d5978d3e0 100644
--- a/cpp/src/IceGrid/Internal.ice
+++ b/cpp/src/IceGrid/Internal.ice
@@ -119,7 +119,8 @@ interface Server
* otherwise.
*
**/
- ["amd"] bool start();
+ ["amd"] void start()
+ throws ServerStartException;
/**
*
diff --git a/cpp/src/IceGrid/Parser.cpp b/cpp/src/IceGrid/Parser.cpp
index 0ea7890faf2..b94bd1fcfbc 100644
--- a/cpp/src/IceGrid/Parser.cpp
+++ b/cpp/src/IceGrid/Parser.cpp
@@ -632,10 +632,11 @@ Parser::startServer(const list<string>& args)
try
{
- if(!_admin->startServer(args.front()))
- {
- error("the server didn't start successfully");
- }
+ _admin->startServer(args.front());
+ }
+ catch(const ServerStartException& ex)
+ {
+ error("the server didn't start successfully:\n" + ex.reason);
}
catch(const Ice::Exception& ex)
{
diff --git a/cpp/src/IceGrid/ServerI.cpp b/cpp/src/IceGrid/ServerI.cpp
index 60b1eef559d..d6a83ed336d 100644
--- a/cpp/src/IceGrid/ServerI.cpp
+++ b/cpp/src/IceGrid/ServerI.cpp
@@ -222,7 +222,7 @@ ServerI::stop(const Ice::Current&)
case ServerI::WaitForActivationTimeout:
case ServerI::Active:
{
- setStateNoSync(ServerI::Deactivating);
+ setStateNoSync(ServerI::Deactivating, "The server is being stopped.");
break;
}
case ServerI::Destroying:
@@ -283,7 +283,7 @@ ServerI::destroy(const Ice::Current& current)
case ServerI::Active:
{
stop = true;
- setStateNoSync(ServerI::Destroying);
+ setStateNoSync(ServerI::Destroying, "The server is being destroyed.");
break;
}
case ServerI::Activating:
@@ -355,7 +355,7 @@ ServerI::terminated(const Ice::Current& current)
case ServerI::WaitForActivationTimeout:
case ServerI::Active:
{
- setStateNoSync(ServerI::Deactivating);
+ setStateNoSync(ServerI::Deactivating, "The server terminated.");
newState = ServerI::Inactive;
break;
}
@@ -503,7 +503,15 @@ ServerI::startInternal(ServerActivation act, const AMD_Server_startPtr& amdCB)
{
if(amdCB)
{
- amdCB->ice_response(false);
+ if(_activation == Disabled)
+ {
+ amdCB->ice_exception(ServerStartException(_id, "The server is disabled."));
+ }
+ else
+ {
+ ServerStartException ex(_id, "The server activation doesn't allow this activation mode.");
+ amdCB->ice_exception(ex);
+ }
}
return false;
}
@@ -530,7 +538,7 @@ ServerI::startInternal(ServerActivation act, const AMD_Server_startPtr& amdCB)
{
if(amdCB)
{
- amdCB->ice_response(false);
+ amdCB->ice_exception(ServerStartException(_id, "The server activation timed out."));
}
return false;
}
@@ -538,7 +546,7 @@ ServerI::startInternal(ServerActivation act, const AMD_Server_startPtr& amdCB)
{
if(amdCB)
{
- amdCB->ice_response(true);
+ amdCB->ice_response();
}
return true;
}
@@ -595,21 +603,19 @@ ServerI::startInternal(ServerActivation act, const AMD_Server_startPtr& amdCB)
try
{
- bool started = _node->getActivator()->activate(desc->id, desc->exe, pwd, options, envs, _this);
- if(!started)
- {
- setState(ServerI::Inactive);
- return false;
- }
- else
- {
- Lock sync(*this);
- _node->getWaitQueue()->add(new WaitForActivationItem(this), IceUtil::Time::seconds(_activationTimeout));
- setStateNoSync(ServerI::WaitForActivation);
- checkActivation();
- notifyAll();
- return true;
- }
+ _node->getActivator()->activate(desc->id, desc->exe, pwd, options, envs, _this);
+
+ Lock sync(*this);
+ _node->getWaitQueue()->add(new WaitForActivationItem(this), IceUtil::Time::seconds(_activationTimeout));
+ setStateNoSync(ServerI::WaitForActivation);
+ checkActivation();
+ notifyAll();
+ return true;
+ }
+ catch(const std::string& ex)
+ {
+ setState(ServerI::Inactive, ex);
+ return false;
}
catch(const Ice::SyscallException& ex)
{
@@ -617,7 +623,9 @@ ServerI::startInternal(ServerActivation act, const AMD_Server_startPtr& amdCB)
out << "activation failed for server `" << _id << "':\n";
out << ex;
- setState(ServerI::Inactive);
+ ostringstream os;
+ os << ex;
+ setState(ServerI::Inactive, os.str());
return false;
}
}
@@ -648,7 +656,7 @@ ServerI::activationFailed(bool timeout)
return;
}
- setStateNoSync(ServerI::WaitForActivationTimeout);
+ setStateNoSync(ServerI::WaitForActivationTimeout, "The server activation timed out.");
if(_node->getTraceLevels()->server > 1)
{
@@ -813,7 +821,11 @@ ServerI::stopInternal(bool kill)
//
// Wait for the process to be set.
//
- timedWait(IceUtil::Time::seconds(_deactivationTimeout));
+ bool notify = timedWait(IceUtil::Time::seconds(_deactivationTimeout));
+ if(!notify)
+ {
+ break;
+ }
}
}
process = _process;
@@ -897,15 +909,15 @@ ServerI::stopInternal(bool kill)
}
void
-ServerI::setState(InternalServerState st)
+ServerI::setState(InternalServerState st, const std::string& reason)
{
Lock sync(*this);
- setStateNoSync(st);
+ setStateNoSync(st, reason);
notifyAll();
}
void
-ServerI::setStateNoSync(InternalServerState st)
+ServerI::setStateNoSync(InternalServerState st, const std::string& reason)
{
InternalServerState previous = _state;
_state = st;
@@ -914,7 +926,21 @@ ServerI::setStateNoSync(InternalServerState st)
{
for(vector<AMD_Server_startPtr>::const_iterator p = _startCB.begin(); p != _startCB.end(); ++p)
{
- (*p)->ice_response(_state == ServerI::Active);
+ if(_state == ServerI::Active)
+ {
+ (*p)->ice_response();
+ }
+ else
+ {
+ if(!reason.empty())
+ {
+ (*p)->ice_exception(ServerStartException(_id, reason));
+ }
+ else
+ {
+ (*p)->ice_exception(ServerStartException(_id, "The server didn't successfully start."));
+ }
+ }
}
_startCB.clear();
diff --git a/cpp/src/IceGrid/ServerI.h b/cpp/src/IceGrid/ServerI.h
index c212efbf0da..ae9277d5112 100644
--- a/cpp/src/IceGrid/ServerI.h
+++ b/cpp/src/IceGrid/ServerI.h
@@ -86,8 +86,8 @@ private:
void checkActivation();
void stopInternal(bool);
- void setState(InternalServerState);
- void setStateNoSync(InternalServerState);
+ void setState(InternalServerState, const std::string& = std::string());
+ void setStateNoSync(InternalServerState, const std::string& = std::string());
void updateImpl(const std::string&, const ServerDescriptorPtr&, bool, const Ice::Current&);
std::string addAdapter(const AdapterDescriptor&, const CommunicatorDescriptorPtr&, const Ice::Current&);