diff options
author | Benoit Foucher <benoit@zeroc.com> | 2012-10-08 15:03:46 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2012-10-08 15:03:46 +0200 |
commit | d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae (patch) | |
tree | 7abffd29e98ff112cec85b658fab404961f8306a /cpp/src/IceBox/ServiceManagerI.cpp | |
parent | FreeBSD port (diff) | |
parent | Win32 fixes (diff) | |
download | ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.bz2 ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.tar.xz ice-d36ec7c740d5dfaa8e4ce2a2df6c9cb0818f01ae.zip |
Merge branch 'mx' into encoding11
Conflicts:
cpp/demo/Freeze/backup/.depend
cpp/demo/Freeze/backup/.depend.mak
cpp/demo/Freeze/bench/.depend
cpp/demo/Freeze/bench/.depend.mak
cpp/demo/Freeze/casino/.depend
cpp/demo/Freeze/casino/.depend.mak
cpp/demo/Freeze/customEvictor/.depend
cpp/demo/Freeze/customEvictor/.depend.mak
cpp/demo/Freeze/library/.depend
cpp/demo/Freeze/library/.depend.mak
cpp/demo/Freeze/phonebook/.depend
cpp/demo/Freeze/phonebook/.depend.mak
cpp/demo/Freeze/transform/.depend
cpp/demo/Freeze/transform/.depend.mak
cpp/demo/Glacier2/callback/.depend
cpp/demo/Glacier2/callback/.depend.mak
cpp/demo/Glacier2/chat/.depend
cpp/demo/Glacier2/chat/.depend.mak
cpp/demo/Ice/async/.depend
cpp/demo/Ice/async/.depend.mak
cpp/demo/Ice/bidir/.depend
cpp/demo/Ice/bidir/.depend.mak
cpp/demo/Ice/callback/.depend
cpp/demo/Ice/callback/.depend.mak
cpp/demo/Ice/converter/.depend
cpp/demo/Ice/converter/.depend.mak
cpp/demo/Ice/hello/.depend
cpp/demo/Ice/hello/.depend.mak
cpp/demo/Ice/interleaved/.depend
cpp/demo/Ice/interleaved/.depend.mak
cpp/demo/Ice/invoke/.depend
cpp/demo/Ice/invoke/.depend.mak
cpp/demo/Ice/latency/.depend
cpp/demo/Ice/latency/.depend.mak
cpp/demo/Ice/minimal/.depend
cpp/demo/Ice/minimal/.depend.mak
cpp/demo/Ice/multicast/.depend
cpp/demo/Ice/multicast/.depend.mak
cpp/demo/Ice/nested/.depend
cpp/demo/Ice/nested/.depend.mak
cpp/demo/Ice/nrvo/.depend
cpp/demo/Ice/nrvo/.depend.mak
cpp/demo/Ice/plugin/.depend
cpp/demo/Ice/plugin/.depend.mak
cpp/demo/Ice/session/.depend
cpp/demo/Ice/session/.depend.mak
cpp/demo/Ice/throughput/.depend
cpp/demo/Ice/throughput/.depend.mak
cpp/demo/Ice/value/.depend
cpp/demo/Ice/value/.depend.mak
cpp/demo/IceBox/hello/.depend
cpp/demo/IceBox/hello/.depend.mak
cpp/demo/IceGrid/allocate/.depend
cpp/demo/IceGrid/allocate/.depend.mak
cpp/demo/IceGrid/icebox/.depend
cpp/demo/IceGrid/icebox/.depend.mak
cpp/demo/IceGrid/replication/.depend
cpp/demo/IceGrid/replication/.depend.mak
cpp/demo/IceGrid/secure/.depend
cpp/demo/IceGrid/secure/.depend.mak
cpp/demo/IceGrid/sessionActivation/.depend
cpp/demo/IceGrid/sessionActivation/.depend.mak
cpp/demo/IceGrid/simple/.depend
cpp/demo/IceGrid/simple/.depend.mak
cpp/demo/IceStorm/clock/.depend
cpp/demo/IceStorm/clock/.depend.mak
cpp/demo/IceStorm/counter/.depend
cpp/demo/IceStorm/counter/.depend.mak
cpp/demo/IceStorm/replicated/.depend
cpp/demo/IceStorm/replicated/.depend.mak
cpp/demo/IceStorm/replicated2/.depend
cpp/demo/IceStorm/replicated2/.depend.mak
cpp/demo/book/evictor_filesystem/.depend
cpp/demo/book/evictor_filesystem/.depend.mak
cpp/demo/book/lifecycle/.depend
cpp/demo/book/lifecycle/.depend.mak
cpp/demo/book/map_filesystem/.depend
cpp/demo/book/map_filesystem/.depend.mak
cpp/demo/book/printer/.depend
cpp/demo/book/printer/.depend.mak
cpp/demo/book/simple_filesystem/.depend
cpp/demo/book/simple_filesystem/.depend.mak
cpp/include/Ice/Outgoing.h
cpp/include/Ice/OutgoingAsync.h
cpp/include/Ice/StreamTraits.h
cpp/src/Freeze/.depend
cpp/src/Freeze/.depend.mak
cpp/src/FreezeScript/.depend
cpp/src/FreezeScript/.depend.mak
cpp/src/Glacier2/.depend
cpp/src/Glacier2/.depend.mak
cpp/src/Glacier2Lib/.depend
cpp/src/Glacier2Lib/.depend.mak
cpp/src/Ice/.depend
cpp/src/Ice/.depend.mak
cpp/src/IceBox/.depend
cpp/src/IceBox/.depend.mak
cpp/src/IceDB/.depend
cpp/src/IceDB/.depend.mak
cpp/src/IceGrid/.depend
cpp/src/IceGrid/.depend.mak
cpp/src/IceGrid/FreezeDB/.depend
cpp/src/IceGrid/FreezeDB/.depend.mak
cpp/src/IceGrid/ServerCache.h
cpp/src/IceGrid/ServerI.h
cpp/src/IceGridLib/.depend
cpp/src/IceGridLib/.depend.mak
cpp/src/IcePatch2/.depend
cpp/src/IcePatch2/.depend.mak
cpp/src/IcePatch2Lib/.depend
cpp/src/IcePatch2Lib/.depend.mak
cpp/src/IceSSL/.depend
cpp/src/IceSSL/.depend.mak
cpp/src/IceStorm/.depend
cpp/src/IceStorm/.depend.mak
cpp/src/IceStorm/FreezeDB/.depend
cpp/src/IceStorm/FreezeDB/.depend.mak
cpp/src/IceStormLib/.depend
cpp/src/IceStormLib/.depend.mak
cpp/src/slice2cpp/Gen.cpp
cpp/test/Freeze/complex/.depend
cpp/test/Freeze/complex/.depend.mak
cpp/test/Freeze/dbmap/.depend
cpp/test/Freeze/dbmap/.depend.mak
cpp/test/Freeze/evictor/.depend
cpp/test/Freeze/evictor/.depend.mak
cpp/test/Freeze/fileLock/.depend
cpp/test/Freeze/fileLock/.depend.mak
cpp/test/FreezeScript/dbmap/.depend
cpp/test/FreezeScript/dbmap/.depend.mak
cpp/test/FreezeScript/evictor/.depend
cpp/test/FreezeScript/evictor/.depend.mak
cpp/test/Glacier2/attack/.depend
cpp/test/Glacier2/attack/.depend.mak
cpp/test/Glacier2/dynamicFiltering/.depend
cpp/test/Glacier2/dynamicFiltering/.depend.mak
cpp/test/Glacier2/override/.depend
cpp/test/Glacier2/override/.depend.mak
cpp/test/Glacier2/router/.depend
cpp/test/Glacier2/router/.depend.mak
cpp/test/Glacier2/sessionControl/.depend
cpp/test/Glacier2/sessionControl/.depend.mak
cpp/test/Glacier2/sessionHelper/.depend
cpp/test/Glacier2/sessionHelper/.depend.mak
cpp/test/Glacier2/ssl/.depend
cpp/test/Glacier2/ssl/.depend.mak
cpp/test/Glacier2/staticFiltering/.depend
cpp/test/Glacier2/staticFiltering/.depend.mak
cpp/test/Ice/adapterDeactivation/.depend
cpp/test/Ice/adapterDeactivation/.depend.mak
cpp/test/Ice/ami/.depend
cpp/test/Ice/ami/.depend.mak
cpp/test/Ice/background/.depend
cpp/test/Ice/background/.depend.mak
cpp/test/Ice/binding/.depend
cpp/test/Ice/binding/.depend.mak
cpp/test/Ice/checksum/.depend
cpp/test/Ice/checksum/.depend.mak
cpp/test/Ice/checksum/server/.depend
cpp/test/Ice/checksum/server/.depend.mak
cpp/test/Ice/custom/.depend
cpp/test/Ice/custom/.depend.mak
cpp/test/Ice/defaultServant/.depend
cpp/test/Ice/defaultServant/.depend.mak
cpp/test/Ice/defaultValue/.depend
cpp/test/Ice/defaultValue/.depend.mak
cpp/test/Ice/dispatcher/.depend
cpp/test/Ice/dispatcher/.depend.mak
cpp/test/Ice/exceptions/.depend
cpp/test/Ice/exceptions/.depend.mak
cpp/test/Ice/facets/.depend
cpp/test/Ice/facets/.depend.mak
cpp/test/Ice/faultTolerance/.depend
cpp/test/Ice/faultTolerance/.depend.mak
cpp/test/Ice/gc/.depend
cpp/test/Ice/gc/.depend.mak
cpp/test/Ice/hash/.depend
cpp/test/Ice/hash/.depend.mak
cpp/test/Ice/hold/.depend
cpp/test/Ice/hold/.depend.mak
cpp/test/Ice/info/.depend
cpp/test/Ice/info/.depend.mak
cpp/test/Ice/inheritance/.depend
cpp/test/Ice/inheritance/.depend.mak
cpp/test/Ice/interceptor/.depend
cpp/test/Ice/interceptor/.depend.mak
cpp/test/Ice/invoke/.depend
cpp/test/Ice/invoke/.depend.mak
cpp/test/Ice/location/.depend
cpp/test/Ice/location/.depend.mak
cpp/test/Ice/objects/.depend
cpp/test/Ice/objects/.depend.mak
cpp/test/Ice/operations/.depend
cpp/test/Ice/operations/.depend.mak
cpp/test/Ice/plugin/.depend
cpp/test/Ice/plugin/.depend.mak
cpp/test/Ice/properties/.depend
cpp/test/Ice/properties/.depend.mak
cpp/test/Ice/proxy/.depend
cpp/test/Ice/proxy/.depend.mak
cpp/test/Ice/retry/.depend
cpp/test/Ice/retry/.depend.mak
cpp/test/Ice/servantLocator/.depend
cpp/test/Ice/servantLocator/.depend.mak
cpp/test/Ice/slicing/exceptions/.depend
cpp/test/Ice/slicing/exceptions/.depend.mak
cpp/test/Ice/slicing/objects/.depend
cpp/test/Ice/slicing/objects/.depend.mak
cpp/test/Ice/stream/.depend
cpp/test/Ice/stream/.depend.mak
cpp/test/Ice/stringConverter/.depend
cpp/test/Ice/stringConverter/.depend.mak
cpp/test/Ice/threadPoolPriority/.depend
cpp/test/Ice/threadPoolPriority/.depend.mak
cpp/test/Ice/timeout/.depend
cpp/test/Ice/timeout/.depend.mak
cpp/test/Ice/udp/.depend
cpp/test/Ice/udp/.depend.mak
cpp/test/IceBox/configuration/.depend
cpp/test/IceBox/configuration/.depend.mak
cpp/test/IceGrid/activation/.depend
cpp/test/IceGrid/activation/.depend.mak
cpp/test/IceGrid/admin/.depend
cpp/test/IceGrid/admin/.depend.mak
cpp/test/IceGrid/allocation/.depend
cpp/test/IceGrid/allocation/.depend.mak
cpp/test/IceGrid/deployer/.depend
cpp/test/IceGrid/deployer/.depend.mak
cpp/test/IceGrid/distribution/.depend
cpp/test/IceGrid/distribution/.depend.mak
cpp/test/IceGrid/replicaGroup/.depend
cpp/test/IceGrid/replicaGroup/.depend.mak
cpp/test/IceGrid/replication/.depend
cpp/test/IceGrid/replication/.depend.mak
cpp/test/IceGrid/session/.depend
cpp/test/IceGrid/session/.depend.mak
cpp/test/IceGrid/simple/.depend
cpp/test/IceGrid/simple/.depend.mak
cpp/test/IceGrid/update/.depend
cpp/test/IceGrid/update/.depend.mak
cpp/test/IceSSL/configuration/.depend
cpp/test/IceSSL/configuration/.depend.mak
cpp/test/IceStorm/federation/.depend
cpp/test/IceStorm/federation/.depend.mak
cpp/test/IceStorm/federation2/.depend
cpp/test/IceStorm/federation2/.depend.mak
cpp/test/IceStorm/rep1/.depend
cpp/test/IceStorm/rep1/.depend.mak
cpp/test/IceStorm/repgrid/.depend
cpp/test/IceStorm/repgrid/.depend.mak
cpp/test/IceStorm/repstress/.depend
cpp/test/IceStorm/repstress/.depend.mak
cpp/test/IceStorm/single/.depend
cpp/test/IceStorm/single/.depend.mak
cpp/test/IceStorm/stress/.depend
cpp/test/IceStorm/stress/.depend.mak
cpp/test/Slice/keyword/.depend
cpp/test/Slice/keyword/.depend.mak
cpp/test/Slice/parser/.depend
cpp/test/Slice/parser/.depend.mak
cpp/test/Slice/structure/.depend
cpp/test/Slice/structure/.depend.mak
py/modules/IcePy/.depend
py/modules/IcePy/.depend.mak
Diffstat (limited to 'cpp/src/IceBox/ServiceManagerI.cpp')
-rw-r--r-- | cpp/src/IceBox/ServiceManagerI.cpp | 374 |
1 files changed, 223 insertions, 151 deletions
diff --git a/cpp/src/IceBox/ServiceManagerI.cpp b/cpp/src/IceBox/ServiceManagerI.cpp index 6a19450e6ce..a81e2a2ea54 100644 --- a/cpp/src/IceBox/ServiceManagerI.cpp +++ b/cpp/src/IceBox/ServiceManagerI.cpp @@ -14,6 +14,9 @@ #include <Ice/SliceChecksums.h> #include <Ice/Initialize.h> #include <Ice/Instance.h> +#include <Ice/PropertiesAdminI.h> +#include <Ice/MetricsAdminI.h> +#include <Ice/InstrumentationI.h> #include <IceBox/ServiceManagerI.h> using namespace Ice; @@ -25,30 +28,6 @@ typedef IceBox::Service* (*SERVICE_FACTORY)(CommunicatorPtr); namespace { -class PropertiesAdminI : public PropertiesAdmin -{ -public: - - PropertiesAdminI(const PropertiesPtr& properties) : - _properties(properties) - { - } - - virtual string getProperty(const string& name, const Current&) - { - return _properties->getProperty(name); - } - - virtual PropertyDict getPropertiesForPrefix(const string& prefix, const Current&) - { - return _properties->getPropertiesForPrefix(prefix); - } - -private: - - const PropertiesPtr _properties; -}; - struct StartServiceInfo { StartServiceInfo(const std::string& service, const std::string& value, const Ice::StringSeq& serverArgs) @@ -65,8 +44,8 @@ struct StartServiceInfo } catch(const IceUtilInternal::BadOptException& ex) { - PluginInitializationException e(__FILE__, __LINE__); - e.reason = "invalid arguments for service `" + name + "':\n" + ex.reason; + FailureException e(__FILE__, __LINE__); + e.reason = "ServiceManager: invalid arguments for service `" + name + "':\n" + ex.reason; throw e; } @@ -157,7 +136,7 @@ IceBox::ServiceManagerI::startService(const string& name, const Current&) info.service->start(name, info.communicator == 0 ? _sharedCommunicator : info.communicator, info.args); started = true; } - catch(const Ice::Exception& ex) + catch(const Exception& ex) { Warning out(_logger); out << "ServiceManager: exception in start for service " << info.name << ":\n"; @@ -233,7 +212,7 @@ IceBox::ServiceManagerI::stopService(const string& name, const Current&) info.service->stop(); stopped = true; } - catch(const Ice::Exception& ex) + catch(const Exception& ex) { Warning out(_logger); out << "ServiceManager: exception while stopping service " << info.name << ":\n"; @@ -272,7 +251,7 @@ IceBox::ServiceManagerI::stopService(const string& name, const Current&) } void -IceBox::ServiceManagerI::addObserver(const ServiceObserverPrx& observer, const Ice::Current&) +IceBox::ServiceManagerI::addObserver(const ServiceObserverPrx& observer, const Current&) { // // Null observers and duplicate registrations are ignored @@ -418,7 +397,29 @@ IceBox::ServiceManagerI::start() // q->args = initData.properties->parseCommandLineOptions(q->name, q->args); } + + // + // If Ice metrics are enabled on the IceBox communicator, we also enable them on the + // shared communicator. + // + IceInternal::MetricsAdminIPtr metricsAdmin; + if(IceMX::CommunicatorObserverIPtr::dynamicCast(_communicator->getObserver())) + { + metricsAdmin = new IceInternal::MetricsAdminI(initData.properties, getProcessLogger()); + initData.observer = new IceMX::CommunicatorObserverI(metricsAdmin); + } + _sharedCommunicator = initialize(initData); + + // + // Ensure the metrics admin plugin uses the same property set as the + // communicator. This is necessary to correctly deal with runtime + // property updates. + // + if(metricsAdmin) + { + metricsAdmin->setProperties(_sharedCommunicator->getProperties()); + } } // @@ -454,18 +455,6 @@ IceBox::ServiceManagerI::start() try { _communicator->addAdminFacet(this, "IceBox.ServiceManager"); - - // - // Add a Properties facet for each service - // - for(vector<ServiceInfo>::iterator r = _services.begin(); r != _services.end(); ++r) - { - const ServiceInfo& info = *r; - CommunicatorPtr communicator = info.communicator != 0 ? info.communicator : _sharedCommunicator; - _communicator->addAdminFacet(new PropertiesAdminI(communicator->getProperties()), - "IceBox.Service." + info.name + ".Properties"); - } - _communicator->getAdmin(); } catch(const ObjectAdapterDeactivatedException&) @@ -532,11 +521,6 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint, { IceUtil::Monitor<IceUtil::Mutex>::Lock lock(*this); - ServiceInfo info; - info.name = service; - info.status = Stopped; - info.args = args; - // // Load the entry point. // @@ -555,57 +539,33 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint, throw ex; } - // - // Invoke the factory function. - // - SERVICE_FACTORY factory = (SERVICE_FACTORY)sym; - try - { - info.service = factory(_communicator); - } - catch(const FailureException&) - { - throw; - } - catch(const Exception& ex) - { - ostringstream s; - s << "ServiceManager: exception in entry point `" + entryPoint + "' for service " << service << ":\n"; - s << ex; - - FailureException e(__FILE__, __LINE__); - e.reason = s.str(); - throw e; - } - catch(...) - { - ostringstream s; - s << "ServiceManager: unknown exception in entry point `" + entryPoint + "' for service " << service; - - FailureException e(__FILE__, __LINE__); - e.reason = s.str(); - throw e; - } + ServiceInfo info; + info.name = service; + info.status = Stopped; + info.args = args; // - // Invoke Service::start(). + // If Ice.UseSharedCommunicator.<name> is not defined, create + // a communicator for the service. The communicator inherits + // from the shared communicator properties. If it's defined + // add the service properties to the shared commnunicator + // property set. // - try + Ice::CommunicatorPtr communicator; + IceInternal::MetricsAdminIPtr metricsAdmin; + if(_communicator->getProperties()->getPropertyAsInt("IceBox.UseSharedCommunicator." + service) > 0) { - // - // If Ice.UseSharedCommunicator.<name> is not defined, create - // a communicator for the service. The communicator inherits - // from the shared communicator properties. If it's defined - // add the service properties to the shared commnunicator - // property set. - // - Ice::CommunicatorPtr communicator; - if(_communicator->getProperties()->getPropertyAsInt("IceBox.UseSharedCommunicator." + service) > 0) + assert(_sharedCommunicator); + communicator = _sharedCommunicator; + IceMX::CommunicatorObserverIPtr o = IceMX::CommunicatorObserverIPtr::dynamicCast(communicator->getObserver()); + if(o) { - assert(_sharedCommunicator); - communicator = _sharedCommunicator; + metricsAdmin = o->getMetricsAdmin(); } - else + } + else + { + try { // // Create the service properties. We use the communicator properties as the default @@ -613,6 +573,7 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint, // InitializationData initData; initData.properties = createServiceProperties(service); + if(!info.args.empty()) { // @@ -620,35 +581,122 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint, // read the service config file if it's specified with --Ice.Config. // initData.properties = createProperties(info.args, initData.properties); - + // // Next, parse the service "<service>.*" command line options (the Ice command // line options were parsed by the createProperties above) // info.args = initData.properties->parseCommandLineOptions(service, info.args); } - + // // Clone the logger to assign a new prefix. // initData.logger = _logger->cloneWithPrefix(initData.properties->getProperty("Ice.ProgramName")); // + // If Ice metrics are enabled on the IceBox communicator, we also enable them on + // the service communicator. + // + if(IceMX::CommunicatorObserverIPtr::dynamicCast(_communicator->getObserver())) + { + metricsAdmin = new IceInternal::MetricsAdminI(initData.properties, initData.logger); + initData.observer = new IceMX::CommunicatorObserverI(metricsAdmin); + } + + // // Remaining command line options are passed to the communicator. This is // necessary for Ice plug-in properties (e.g.: IceSSL). // info.communicator = initialize(info.args, initData); communicator = info.communicator; + + // + // Ensure the metrics admin plugin uses the same property set as the + // communicator. This is necessary to correctly deal with runtime + // property updates. + // + if(metricsAdmin) + { + metricsAdmin->setProperties(communicator->getProperties()); + } + } + catch(const Exception& ex) + { + ostringstream s; + s << "ServiceManager: exception while starting service " << service << ":\n"; + s << ex; + + FailureException e(__FILE__, __LINE__); + e.reason = s.str(); + throw e; } + } + try + { + // + // Add a PropertiesAdmin facet to the service manager's communicator that provides + // access to this service's property set. We do this prior to instantiating the + // service so that the service's constructor is able to access the facet (e.g., + // in case it wants to set a callback). + // + string facetName = "IceBox.Service." + info.name + ".Properties"; + PropertiesAdminIPtr propAdmin = + new PropertiesAdminI(facetName, communicator->getProperties(), communicator->getLogger()); + _communicator->addAdminFacet(propAdmin, facetName); + + // + // If a metrics admin facet is setup for the service, register + // it with the IceBox communicator. + // + if(metricsAdmin) + { + _communicator->addAdminFacet(metricsAdmin, "IceBox.Service." + info.name + ".MetricsAdmin"); + + // Ensure the metrics admin facet is notified of property updates. + propAdmin->addUpdateCallback(metricsAdmin); + } + + // + // Invoke the factory function. + // + SERVICE_FACTORY factory = (SERVICE_FACTORY)sym; + try + { + info.service = factory(_communicator); + } + catch(const FailureException&) + { + throw; + } + catch(const Exception& ex) + { + ostringstream s; + s << "ServiceManager: exception in entry point `" + entryPoint + "' for service " << info.name << ":\n"; + s << ex; + + FailureException e(__FILE__, __LINE__); + e.reason = s.str(); + throw e; + } + catch(...) + { + ostringstream s; + s << "ServiceManager: unknown exception in entry point `" + entryPoint + "' for service " << info.name; + + FailureException e(__FILE__, __LINE__); + e.reason = s.str(); + throw e; + } + // // Start the service. // try { - info.service->start(service, communicator, info.args); - info.status = Started; - + info.service->start(info.name, communicator, info.args); + // // There is no need to notify the observers since the 'start all' // (that indirectly calls this function) occurs before the creation of @@ -656,71 +704,61 @@ IceBox::ServiceManagerI::start(const string& service, const string& entryPoint, // object adapter (so before any observer can be registered) // } + catch(const FailureException&) + { + throw; + } + catch(const Exception& ex) + { + ostringstream s; + s << "ServiceManager: exception while starting service " << info.name << ":\n"; + s << ex; + + FailureException e(__FILE__, __LINE__); + e.reason = s.str(); + throw e; + } catch(...) { - if(info.communicator) - { - try - { - info.communicator->shutdown(); - info.communicator->waitForShutdown(); - } - catch(const Ice::CommunicatorDestroyedException&) - { - // - // Ignore, the service might have already destroyed - // the communicator for its own reasons. - // - } - catch(const Ice::Exception& ex) - { - Warning out(_logger); - out << "ServiceManager: exception while shutting down communicator for service " << service - << ":\n"; - out << ex; - } + ostringstream s; + s << "ServiceManager: unknown exception while starting service " << info.name; - try - { - info.communicator->destroy(); - info.communicator = 0; - } - catch(const Exception& ex) - { - Warning out(_logger); - out << "ServiceManager: exception while destroying communicator for service " << service - << ":\n"; - out << ex; - } - } - throw; + FailureException e(__FILE__, __LINE__); + e.reason = s.str(); + throw e; } info.library = library; + info.status = Started; _services.push_back(info); } - catch(const FailureException&) + catch(const ObjectAdapterDeactivatedException&) { - throw; + // + // Can be raised by addAdminFacet if the service manager communicator has been shut down. + // + if(info.communicator) + { + destroyServiceCommunicator(info.name, info.communicator); + } } - catch(const Exception& ex) + catch(const Exception&) { - ostringstream s; - s << "ServiceManager: exception while starting service " << service << ":\n"; - s << ex; + try + { + _communicator->removeAdminFacet("IceBox.Service." + info.name + ".Properties"); + } + catch(const LocalException&) + { + // Ignored + } - FailureException e(__FILE__, __LINE__); - e.reason = s.str(); - throw e; - } - catch(...) - { - ostringstream s; - s << "ServiceManager: unknown exception while starting service " << service; + if(info.communicator) + { + destroyServiceCommunicator(info.name, info.communicator); + } - FailureException e(__FILE__, __LINE__); - e.reason = s.str(); - throw e; + throw; } } @@ -759,7 +797,7 @@ IceBox::ServiceManagerI::stopAll() info.status = Stopped; stoppedServices.push_back(info.name); } - catch(const Ice::Exception& ex) + catch(const Exception& ex) { Warning out(_logger); out << "ServiceManager: exception while stopping service " << info.name << ":\n"; @@ -793,14 +831,14 @@ IceBox::ServiceManagerI::stopAll() info.communicator->shutdown(); info.communicator->waitForShutdown(); } - catch(const Ice::CommunicatorDestroyedException&) + catch(const CommunicatorDestroyedException&) { // // Ignore, the service might have already destroyed // the communicator for its own reasons. // } - catch(const Ice::Exception& ex) + catch(const Exception& ex) { Warning out(_logger); out << "ServiceManager: exception while stopping service " << info.name << ":\n"; @@ -978,3 +1016,37 @@ ServiceManagerI::observerCompleted(const Ice::AsyncResultPtr& result) } } } + +void +IceBox::ServiceManagerI::destroyServiceCommunicator(const string& service, const CommunicatorPtr& communicator) +{ + try + { + communicator->shutdown(); + communicator->waitForShutdown(); + } + catch(const CommunicatorDestroyedException&) + { + // + // Ignore, the service might have already destroyed + // the communicator for its own reasons. + // + } + catch(const Exception& ex) + { + Warning out(_logger); + out << "ServiceManager: exception in shutting down communicator for service " << service << ":\n"; + out << ex; + } + + try + { + communicator->destroy(); + } + catch(const Exception& ex) + { + Warning out(_logger); + out << "ServiceManager: exception in shutting down communicator for service " << service << ":\n"; + out << ex; + } +} |