diff options
author | Benoit Foucher <benoit@zeroc.com> | 2005-10-17 16:14:28 +0000 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2005-10-17 16:14:28 +0000 |
commit | 0ac98b0901f78a17fd74780fd217719cad2ed529 (patch) | |
tree | a393ac9ac8d3bb1ba0b82c3502d7020a5431ea74 /cpp/src | |
parent | bug 515: remove Ice.ConnectionIdleTime (diff) | |
download | ice-0ac98b0901f78a17fd74780fd217719cad2ed529.tar.bz2 ice-0ac98b0901f78a17fd74780fd217719cad2ed529.tar.xz ice-0ac98b0901f78a17fd74780fd217719cad2ed529.zip |
Changed IceGrid::Admin::start() to provide the reason of the failure to
start the server.
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/IceGrid/Activator.cpp | 12 | ||||
-rw-r--r-- | cpp/src/IceGrid/Activator.h | 2 | ||||
-rw-r--r-- | cpp/src/IceGrid/AdminI.cpp | 7 | ||||
-rw-r--r-- | cpp/src/IceGrid/AdminI.h | 2 | ||||
-rw-r--r-- | cpp/src/IceGrid/Internal.ice | 3 | ||||
-rw-r--r-- | cpp/src/IceGrid/Parser.cpp | 9 | ||||
-rw-r--r-- | cpp/src/IceGrid/ServerI.cpp | 82 | ||||
-rw-r--r-- | cpp/src/IceGrid/ServerI.h | 4 |
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&); |