From 1652b782824c9c24638512b57b74dae8745d2c79 Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Tue, 15 Jul 2014 12:59:43 +0200 Subject: Fixed ICE-4611: added finder objects for locator/router/IceStorm to allow easily retrieving proxies without knowning the instance name --- cpp/src/Glacier2/Glacier2Router.cpp | 51 ++++++++++++++++++++++++++++++++----- cpp/src/Glacier2/SessionRouterI.cpp | 10 -------- cpp/src/Ice/PropertyNames.cpp | 4 ++- cpp/src/Ice/PropertyNames.h | 2 +- cpp/src/IceGrid/Client.cpp | 6 ++--- cpp/src/IceGrid/RegistryI.cpp | 28 ++++++++++++++++---- cpp/src/IceStorm/Admin.cpp | 28 +++++++++++++++----- cpp/src/IceStorm/Service.cpp | 34 ++++++++++++++++++++----- 8 files changed, 124 insertions(+), 39 deletions(-) (limited to 'cpp/src') diff --git a/cpp/src/Glacier2/Glacier2Router.cpp b/cpp/src/Glacier2/Glacier2Router.cpp index b8589caa4e0..a44e8db6985 100644 --- a/cpp/src/Glacier2/Glacier2Router.cpp +++ b/cpp/src/Glacier2/Glacier2Router.cpp @@ -22,7 +22,7 @@ using namespace std; using namespace Ice; using namespace Glacier2; -namespace Glacier2 +namespace { class RouterService : public Service @@ -66,14 +66,33 @@ public: } }; +class FinderI : public Ice::RouterFinder +{ +public: + + FinderI(const Glacier2::RouterPrx& router) : _router(router) + { + } + + virtual Ice::RouterPrx + getRouter(const Ice::Current&) + { + return _router; + } + +private: + + const Glacier2::RouterPrx _router; +}; + }; -Glacier2::RouterService::RouterService() +RouterService::RouterService() { } bool -Glacier2::RouterService::start(int argc, char* argv[], int& status) +RouterService::start(int argc, char* argv[], int& status) { bool nowarn; @@ -465,6 +484,24 @@ Glacier2::RouterService::start(int argc, char* argv[], int& status) // _sessionRouter = new SessionRouterI(_instance, verifier, sessionManager, sslVerifier, sslSessionManager); + // + // Th session router is used directly as servant for the main + // Glacier2 router Ice object. + // + Identity routerId; + routerId.category = _instance->properties()->getPropertyWithDefault("Glacier2.InstanceName", "Glacier2"); + routerId.name = "router"; + Glacier2::RouterPrx routerPrx = Glacier2::RouterPrx::uncheckedCast(clientAdapter->add(_sessionRouter, routerId)); + + // + // Add the Ice router finder object to allow retrieving the router + // proxy with just the endpoint information of the router. + // + Identity finderId; + finderId.category = "Ice"; + finderId.name = "RouterFinder"; + clientAdapter->add(new FinderI(routerPrx), finderId); + if(_instance->getObserver()) { _instance->getObserver()->setObserverUpdater(_sessionRouter); @@ -496,7 +533,7 @@ Glacier2::RouterService::start(int argc, char* argv[], int& status) } bool -Glacier2::RouterService::stop() +RouterService::stop() { if(_sessionRouter) { @@ -517,7 +554,7 @@ Glacier2::RouterService::stop() } CommunicatorPtr -Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[], +RouterService::initializeCommunicator(int& argc, char* argv[], const InitializationData& initializationData) { InitializationData initData = initializationData; @@ -549,7 +586,7 @@ Glacier2::RouterService::initializeCommunicator(int& argc, char* argv[], } void -Glacier2::RouterService::usage(const string& appName) +RouterService::usage(const string& appName) { string options = "Options:\n" @@ -581,6 +618,6 @@ main(int argc, char* argv[]) #endif { - Glacier2::RouterService svc; + RouterService svc; return svc.main(argc, argv); } diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 992cd8f67dd..21145379e4e 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -602,14 +602,6 @@ SessionRouterI::SessionRouterI(const InstancePtr& instance, _sessionDestroyCallback(newCallback_Session_destroy(this, &SessionRouterI::sessionDestroyException)), _destroy(false) { - // - // This session router is used directly as servant for the main - // Glacier2 router Ice object. - // - Identity routerId; - routerId.category = _instance->properties()->getPropertyWithDefault("Glacier2.InstanceName", "Glacier2"); - routerId.name = "router"; - if(_sessionThread) { __setNoDelete(true); @@ -629,8 +621,6 @@ SessionRouterI::SessionRouterI(const InstancePtr& instance, try { - _instance->clientObjectAdapter()->add(this, routerId); - // // All other calls on the client object adapter are dispatched to // a router servant based on connection information. diff --git a/cpp/src/Ice/PropertyNames.cpp b/cpp/src/Ice/PropertyNames.cpp index acadc7fb151..475a08db4b2 100644 --- a/cpp/src/Ice/PropertyNames.cpp +++ b/cpp/src/Ice/PropertyNames.cpp @@ -6,7 +6,7 @@ // ICE_LICENSE file included in this distribution. // // ********************************************************************** -// Generated by makeprops.py from file ../config/PropertyNames.xml, Wed Jul 9 18:08:33 2014 +// Generated by makeprops.py from file ./config/PropertyNames.xml, Tue Jul 15 11:44:29 2014 // IMPORTANT: Do not edit this file -- any edits made here will be lost! @@ -1047,6 +1047,8 @@ const IceInternal::PropertyArray const IceInternal::Property IceStormAdminPropsData[] = { IceInternal::Property("IceStormAdmin.TopicManager.*", false, 0), + IceInternal::Property("IceStormAdmin.Host", false, 0), + IceInternal::Property("IceStormAdmin.Port", false, 0), }; const IceInternal::PropertyArray diff --git a/cpp/src/Ice/PropertyNames.h b/cpp/src/Ice/PropertyNames.h index 7f413070df8..126b5ab08f0 100644 --- a/cpp/src/Ice/PropertyNames.h +++ b/cpp/src/Ice/PropertyNames.h @@ -6,7 +6,7 @@ // ICE_LICENSE file included in this distribution. // // ********************************************************************** -// Generated by makeprops.py from file ../config/PropertyNames.xml, Wed Jul 9 18:08:33 2014 +// Generated by makeprops.py from file ./config/PropertyNames.xml, Tue Jul 15 11:44:29 2014 // IMPORTANT: Do not edit this file -- any edits made here will be lost! diff --git a/cpp/src/IceGrid/Client.cpp b/cpp/src/IceGrid/Client.cpp index 191d5749a88..df2a0979b52 100644 --- a/cpp/src/IceGrid/Client.cpp +++ b/cpp/src/IceGrid/Client.cpp @@ -527,13 +527,13 @@ Client::run(StringSeq& originalArgs) { const int timeout = 3000; // 3s connection timeout. ostringstream os; - os << "IceGridDiscovery/Lookup" << (ssl ? " -s" : ""); + os << "Ice/LocatorFinder" << (ssl ? " -s" : ""); os << ":tcp -h \"" << host << "\" -p " << (port == 0 ? 4061 : port) << " -t " << timeout; os << ":ssl -h \"" << host << "\" -p " << (port == 0 ? 4063 : port) << " -t " << timeout; - LookupPrx lookup = LookupPrx::uncheckedCast(communicator()->stringToProxy(os.str())); + LocatorFinderPrx finder = LocatorFinderPrx::uncheckedCast(communicator()->stringToProxy(os.str())); try { - communicator()->setDefaultLocator(lookup->getLocator()); + communicator()->setDefaultLocator(finder->getLocator()); } catch(const Ice::LocalException&) { diff --git a/cpp/src/IceGrid/RegistryI.cpp b/cpp/src/IceGrid/RegistryI.cpp index 0892fd5a1f8..8ab2ed0bd92 100644 --- a/cpp/src/IceGrid/RegistryI.cpp +++ b/cpp/src/IceGrid/RegistryI.cpp @@ -174,6 +174,25 @@ private: const WellKnownObjectsManagerPtr _wellKnownObjects; }; +class FinderI : public Ice::LocatorFinder +{ +public: + + FinderI(const WellKnownObjectsManagerPtr& wellKnownObjects) : _wellKnownObjects(wellKnownObjects) + { + } + + virtual Ice::LocatorPrx + getLocator(const Ice::Current&) + { + return _wellKnownObjects->getLocator(); + } + +private: + + const WellKnownObjectsManagerPtr _wellKnownObjects; +}; + } RegistryI::RegistryI(const CommunicatorPtr& communicator, @@ -585,11 +604,9 @@ RegistryI::startImpl() } // - // Setup the lookup servant and add it to the client adapter. + // Add the locator finder object to the client adapter. // - Ice::Identity id = _communicator->stringToIdentity("IceGridDiscovery/Lookup"); - Ice::ObjectPtr lookup = new LookupI(_instanceName, _wellKnownObjects); - _clientAdapter->add(lookup, id); + _clientAdapter->add(new FinderI(_wellKnownObjects), _communicator->stringToIdentity("Ice/LocatorFinder")); // // Setup the discovery object adapter and also add it the lookup @@ -623,8 +640,9 @@ RegistryI::startImpl() try { + Ice::Identity lookupId = _communicator->stringToIdentity("IceGridDiscovery/Lookup"); discoveryAdapter = _communicator->createObjectAdapter("IceGrid.Registry.Discovery"); - discoveryAdapter->add(lookup, id); + discoveryAdapter->add(new LookupI(_instanceName, _wellKnownObjects), lookupId); } catch(const Ice::LocalException& ex) { diff --git a/cpp/src/IceStorm/Admin.cpp b/cpp/src/IceStorm/Admin.cpp index 6377b77c5e9..392d58fea8c 100644 --- a/cpp/src/IceStorm/Admin.cpp +++ b/cpp/src/IceStorm/Admin.cpp @@ -41,12 +41,7 @@ main(int argc, char* argv[]) Ice::InitializationData id; Ice::StringSeq args = Ice::argsToStringSeq(argc, argv); id.properties = Ice::createProperties(args); - // - // We don't want to load DB plug-ins with icestormadmin, as this will - // cause FileLock issues when run with the same configuration file - // used by the service. - // - id.properties->setProperty("Ice.Plugin.DB", ""); + id.properties->setProperty("Ice.Warn.Endpoints", "0"); int rc = app.main(argc, argv, id); return rc; } @@ -155,6 +150,27 @@ Client::run(int argc, char* argv[]) } } + if(!defaultManager) + { + string host = properties->getProperty("IceStormAdmin.Host"); + string port = properties->getProperty("IceStormAdmin.Port"); + + const int timeout = 3000; // 3s connection timeout. + ostringstream os; + os << "IceStorm/Finder"; + os << ":tcp" << (host.empty() ? "" : (" -h \"" + host + "\"")) << " -p " << port << " -t " << timeout; + os << ":ssl" << (host.empty() ? "" : (" -h \"" + host + "\"")) << " -p " << port << " -t " << timeout; + IceStorm::FinderPrx finder = IceStorm::FinderPrx::uncheckedCast(communicator()->stringToProxy(os.str())); + try + { + defaultManager = finder->getTopicManager(); + } + catch(const Ice::LocalException&) + { + // Ignore. + } + } + if(!defaultManager) { cerr << appName() << ": no manager proxies configured" << endl; diff --git a/cpp/src/IceStorm/Service.cpp b/cpp/src/IceStorm/Service.cpp index 02423174323..dc722a2ba6d 100644 --- a/cpp/src/IceStorm/Service.cpp +++ b/cpp/src/IceStorm/Service.cpp @@ -35,7 +35,7 @@ using namespace IceStorm; using namespace IceStormInternal; using namespace IceStormElection; -namespace IceStormInternal +namespace { class ServiceI : public IceStormInternal::Service @@ -70,6 +70,25 @@ private: InstancePtr _instance; }; +class FinderI : public IceStorm::Finder +{ +public: + + FinderI(const TopicManagerPrx& topicManager) : _topicManager(topicManager) + { + } + + virtual TopicManagerPrx + getTopicManager(const Ice::Current&) + { + return _topicManager; + } + +private: + + const TopicManagerPrx _topicManager; +}; + } extern "C" @@ -372,6 +391,9 @@ ServiceI::start( throw e; } } + + topicAdapter->add(new FinderI(TopicManagerPrx::uncheckedCast(topicAdapter->createProxy(topicManagerId))), + communicator->stringToIdentity("IceStorm/Finder")); topicAdapter->activate(); publishAdapter->activate(); @@ -379,11 +401,11 @@ ServiceI::start( void ServiceI::start(const CommunicatorPtr& communicator, - const ObjectAdapterPtr& topicAdapter, - const ObjectAdapterPtr& publishAdapter, - const string& name, - const Ice::Identity& id, - const string& /*dbEnv*/) + const ObjectAdapterPtr& topicAdapter, + const ObjectAdapterPtr& publishAdapter, + const string& name, + const Ice::Identity& id, + const string& /*dbEnv*/) { // // For IceGrid we don't validate the properties as all sorts of -- cgit v1.2.3