diff options
author | Benoit Foucher <benoit@zeroc.com> | 2017-03-04 09:10:18 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2017-03-04 09:10:18 +0100 |
commit | b21a2791675c12b82758583e5024421c91537cd7 (patch) | |
tree | db44f1089cc23665bec372032e0b37be786b0338 /cpp/src | |
parent | More man page fixes (diff) | |
download | ice-b21a2791675c12b82758583e5024421c91537cd7.tar.bz2 ice-b21a2791675c12b82758583e5024421c91537cd7.tar.xz ice-b21a2791675c12b82758583e5024421c91537cd7.zip |
Fixed ICE-3710 - optional routing tables
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Glacier2/RouterI.cpp | 7 | ||||
-rw-r--r-- | cpp/src/Glacier2/RouterI.h | 2 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.cpp | 4 | ||||
-rw-r--r-- | cpp/src/Glacier2/SessionRouterI.h | 2 | ||||
-rw-r--r-- | cpp/src/Ice/RouterInfo.cpp | 22 | ||||
-rw-r--r-- | cpp/src/Ice/RouterInfo.h | 6 | ||||
-rw-r--r-- | cpp/src/IceBridge/IceBridge.cpp | 3 | ||||
-rw-r--r-- | cpp/src/IceGrid/Client.cpp | 3 | ||||
-rw-r--r-- | cpp/src/slice2java/GenCompat.cpp | 4 |
9 files changed, 33 insertions, 20 deletions
diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp index a33f2cb4dac..fcbeb878929 100644 --- a/cpp/src/Glacier2/RouterI.cpp +++ b/cpp/src/Glacier2/RouterI.cpp @@ -18,7 +18,7 @@ using namespace std; using namespace Ice; using namespace Glacier2; -Glacier2::RouterI::RouterI(const InstancePtr& instance, const ConnectionPtr& connection, const string& userId, +Glacier2::RouterI::RouterI(const InstancePtr& instance, const ConnectionPtr& connection, const string& userId, const SessionPrx& session, const Identity& controlId, const FilterManagerPtr& filters, const Ice::Context& context) : _instance(instance), @@ -39,7 +39,7 @@ Glacier2::RouterI::RouterI(const InstancePtr& instance, const ConnectionPtr& con // if(_instance->properties()->getPropertyAsInt("Glacier2.ReturnClientProxy") > 0) { - const_cast<Ice::ObjectPrx&>(_clientProxy) = + const_cast<Ice::ObjectPrx&>(_clientProxy) = _instance->clientObjectAdapter()->createProxy(stringToIdentity("dummy")); } @@ -130,9 +130,10 @@ Glacier2::RouterI::destroy(const Callback_Session_destroyPtr& asyncCB) } ObjectPrx -Glacier2::RouterI::getClientProxy(const Current&) const +Glacier2::RouterI::getClientProxy(IceUtil::Optional<bool>& hasRoutingTable, const Current&) const { // No mutex lock necessary, _clientProxy is immutable and is never destroyed. + hasRoutingTable = true; return _clientProxy; } diff --git a/cpp/src/Glacier2/RouterI.h b/cpp/src/Glacier2/RouterI.h index cb94050469d..cb17f1e7ad9 100644 --- a/cpp/src/Glacier2/RouterI.h +++ b/cpp/src/Glacier2/RouterI.h @@ -38,7 +38,7 @@ public: void destroy(const Callback_Session_destroyPtr&); - virtual Ice::ObjectPrx getClientProxy(const Ice::Current& = Ice::noExplicitCurrent) const; + virtual Ice::ObjectPrx getClientProxy(IceUtil::Optional<bool>&, const Ice::Current& = Ice::noExplicitCurrent) const; virtual Ice::ObjectPrx getServerProxy(const Ice::Current& = Ice::noExplicitCurrent) const; virtual Ice::ObjectProxySeq addProxies(const Ice::ObjectProxySeq&, const Ice::Current&); virtual std::string getCategoryForClient(const Ice::Current&) const; diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 66afe1fe2b4..563b58cf8f7 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -775,9 +775,9 @@ SessionRouterI::destroy() } ObjectPrx -SessionRouterI::getClientProxy(const Current& current) const +SessionRouterI::getClientProxy(IceUtil::Optional<bool>& hasRoutingTable, const Current& current) const { - return getRouter(current.con, current.id)->getClientProxy(current); // Forward to the per-client router. + return getRouter(current.con, current.id)->getClientProxy(hasRoutingTable, current); // Forward to the per-client router. } ObjectPrx diff --git a/cpp/src/Glacier2/SessionRouterI.h b/cpp/src/Glacier2/SessionRouterI.h index 4d4a3eb4eee..60392fb8de0 100644 --- a/cpp/src/Glacier2/SessionRouterI.h +++ b/cpp/src/Glacier2/SessionRouterI.h @@ -100,7 +100,7 @@ public: virtual ~SessionRouterI(); void destroy(); - virtual Ice::ObjectPrx getClientProxy(const Ice::Current&) const; + virtual Ice::ObjectPrx getClientProxy(IceUtil::Optional<bool>&, const Ice::Current&) const; virtual Ice::ObjectPrx getServerProxy(const Ice::Current&) const; virtual Ice::ObjectProxySeq addProxies(const Ice::ObjectProxySeq&, const Ice::Current&); virtual std::string getCategoryForClient(const Ice::Current&) const; diff --git a/cpp/src/Ice/RouterInfo.cpp b/cpp/src/Ice/RouterInfo.cpp index 2ddf981dfec..edee8ca9026 100644 --- a/cpp/src/Ice/RouterInfo.cpp +++ b/cpp/src/Ice/RouterInfo.cpp @@ -109,7 +109,7 @@ IceInternal::RouterManager::erase(const RouterPrxPtr& rtr) return info; } -IceInternal::RouterInfo::RouterInfo(const RouterPrxPtr& router) : _router(router) +IceInternal::RouterInfo::RouterInfo(const RouterPrxPtr& router) : _router(router), _hasRoutingTable(false) { assert(_router); } @@ -148,14 +148,17 @@ IceInternal::RouterInfo::getClientEndpoints() } } - return setClientEndpoints(_router->getClientProxy()); + IceUtil::Optional<bool> hasRoutingTable; + Ice::ObjectPrxPtr proxy = _router->getClientProxy(hasRoutingTable); + return setClientEndpoints(proxy, hasRoutingTable ? hasRoutingTable.value() : true); } void IceInternal::RouterInfo::getClientProxyResponse(const Ice::ObjectPrxPtr& proxy, + const IceUtil::Optional<bool>& hasRoutingTable, const GetClientEndpointsCallbackPtr& callback) { - callback->setEndpoints(setClientEndpoints(proxy)); + callback->setEndpoints(setClientEndpoints(proxy, hasRoutingTable ? hasRoutingTable.value() : true)); } void @@ -183,9 +186,9 @@ IceInternal::RouterInfo::getClientEndpoints(const GetClientEndpointsCallbackPtr& #ifdef ICE_CPP11_MAPPING RouterInfoPtr self = this; _router->getClientProxyAsync( - [self, callback](const Ice::ObjectPrxPtr& proxy) + [self, callback](const Ice::ObjectPrxPtr& proxy, Ice::optional<bool> hasRoutingTable) { - self->getClientProxyResponse(proxy, callback); + self->getClientProxyResponse(proxy, hasRoutingTable, callback); }, [self, callback](exception_ptr e) { @@ -239,7 +242,11 @@ IceInternal::RouterInfo::addProxy(const Ice::ObjectPrxPtr& proxy, const AddProxy assert(proxy); { IceUtil::Mutex::Lock sync(*this); - if(_identities.find(proxy->ice_getIdentity()) != _identities.end()) + if(!_hasRoutingTable) + { + return true; // The router implementation doesn't maintain a routing table. + } + else if(_identities.find(proxy->ice_getIdentity()) != _identities.end()) { // // Only add the proxy to the router if it's not already in our local map. @@ -303,11 +310,12 @@ IceInternal::RouterInfo::clearCache(const ReferencePtr& ref) } vector<EndpointIPtr> -IceInternal::RouterInfo::setClientEndpoints(const Ice::ObjectPrxPtr& proxy) +IceInternal::RouterInfo::setClientEndpoints(const Ice::ObjectPrxPtr& proxy, bool hasRoutingTable) { IceUtil::Mutex::Lock sync(*this); if(_clientEndpoints.empty()) { + _hasRoutingTable = hasRoutingTable; if(!proxy) { // diff --git a/cpp/src/Ice/RouterInfo.h b/cpp/src/Ice/RouterInfo.h index 40aa73c5175..1127b54fe84 100644 --- a/cpp/src/Ice/RouterInfo.h +++ b/cpp/src/Ice/RouterInfo.h @@ -93,7 +93,8 @@ public: // return _router; } - void getClientProxyResponse(const Ice::ObjectPrxPtr&, const GetClientEndpointsCallbackPtr&); + void getClientProxyResponse(const Ice::ObjectPrxPtr&, const IceUtil::Optional<bool>&, + const GetClientEndpointsCallbackPtr&); void getClientProxyException(const Ice::Exception&, const GetClientEndpointsCallbackPtr&); std::vector<EndpointIPtr> getClientEndpoints(); void getClientEndpoints(const GetClientEndpointsCallbackPtr&); @@ -138,7 +139,7 @@ public: // // The following methods need to be public for access by AMI callbacks. // - std::vector<EndpointIPtr> setClientEndpoints(const Ice::ObjectPrxPtr&); + std::vector<EndpointIPtr> setClientEndpoints(const Ice::ObjectPrxPtr&, bool); std::vector<EndpointIPtr> setServerEndpoints(const Ice::ObjectPrxPtr&); void addAndEvictProxies(const Ice::ObjectPrxPtr&, const Ice::ObjectProxySeq&); @@ -147,6 +148,7 @@ private: const Ice::RouterPrxPtr _router; std::vector<EndpointIPtr> _clientEndpoints; std::vector<EndpointIPtr> _serverEndpoints; + bool _hasRoutingTable; Ice::ObjectAdapterPtr _adapter; std::set<Ice::Identity> _identities; std::multiset<Ice::Identity> _evictedIdentities; diff --git a/cpp/src/IceBridge/IceBridge.cpp b/cpp/src/IceBridge/IceBridge.cpp index 1381e6f6e34..76a3ba0ab5d 100644 --- a/cpp/src/IceBridge/IceBridge.cpp +++ b/cpp/src/IceBridge/IceBridge.cpp @@ -423,8 +423,9 @@ class RouterI : public Router { public: - virtual ObjectPrx getClientProxy(const Current&) const + virtual ObjectPrx getClientProxy(IceUtil::Optional<bool>& hasRoutingTable, const Current&) const { + hasRoutingTable = false; // We don't maintain a routing table, no need to call addProxies on this impl. return 0; } diff --git a/cpp/src/IceGrid/Client.cpp b/cpp/src/IceGrid/Client.cpp index 3473bdb72ca..3e587f8a88e 100644 --- a/cpp/src/IceGrid/Client.cpp +++ b/cpp/src/IceGrid/Client.cpp @@ -129,8 +129,9 @@ public: } virtual ObjectPrx - getClientProxy(const Current&) const + getClientProxy(IceUtil::Optional<bool>& hasRoutingTable, const Current&) const { + hasRoutingTable = false; return _clientProxy; } diff --git a/cpp/src/slice2java/GenCompat.cpp b/cpp/src/slice2java/GenCompat.cpp index 3bbb7fbd7ab..a6c8c7d1b4d 100644 --- a/cpp/src/slice2java/GenCompat.cpp +++ b/cpp/src/slice2java/GenCompat.cpp @@ -391,7 +391,7 @@ Slice::JavaCompatVisitor::getAsyncCallbackInterface(const OperationPtr& op, cons else { ClassDefPtr cl = ClassDefPtr::dynamicCast(op->container()); - return "_Callback_" + cl->name() + "_" + op->name(); + return getPackage(cl) + "._Callback_" + cl->name() + "_" + op->name(); } } @@ -464,7 +464,7 @@ Slice::JavaCompatVisitor::getAsyncCallbackBaseClass(const OperationPtr& op, bool { os << "IceInternal.TwowayCallback implements "; } - os << "_Callback_" << cl->name() << "_" << op->name(); + os << getPackage(cl) << "._Callback_" << cl->name() << "_" << op->name(); return os.str(); } } |