summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-03-04 09:10:18 +0100
committerBenoit Foucher <benoit@zeroc.com>2017-03-04 09:10:18 +0100
commitb21a2791675c12b82758583e5024421c91537cd7 (patch)
treedb44f1089cc23665bec372032e0b37be786b0338 /cpp
parentMore man page fixes (diff)
downloadice-b21a2791675c12b82758583e5024421c91537cd7.tar.bz2
ice-b21a2791675c12b82758583e5024421c91537cd7.tar.xz
ice-b21a2791675c12b82758583e5024421c91537cd7.zip
Fixed ICE-3710 - optional routing tables
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/Glacier2/RouterI.cpp7
-rw-r--r--cpp/src/Glacier2/RouterI.h2
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp4
-rw-r--r--cpp/src/Glacier2/SessionRouterI.h2
-rw-r--r--cpp/src/Ice/RouterInfo.cpp22
-rw-r--r--cpp/src/Ice/RouterInfo.h6
-rw-r--r--cpp/src/IceBridge/IceBridge.cpp3
-rw-r--r--cpp/src/IceGrid/Client.cpp3
-rw-r--r--cpp/src/slice2java/GenCompat.cpp4
-rw-r--r--cpp/test/Ice/background/Server.cpp3
-rw-r--r--cpp/test/IceGrid/allocation/AllTests.cpp2
11 files changed, 36 insertions, 22 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();
}
}
diff --git a/cpp/test/Ice/background/Server.cpp b/cpp/test/Ice/background/Server.cpp
index b278b191d44..27fc1624dc2 100644
--- a/cpp/test/Ice/background/Server.cpp
+++ b/cpp/test/Ice/background/Server.cpp
@@ -83,8 +83,9 @@ class RouterI : public Ice::Router
public:
virtual Ice::ObjectPrxPtr
- getClientProxy(const Ice::Current& current) const
+ getClientProxy(IceUtil::Optional<bool>& hasRoutingTable, const Ice::Current& current) const
{
+ hasRoutingTable = true;
_controller->checkCallPause(current);
return ICE_NULLPTR;
}
diff --git a/cpp/test/IceGrid/allocation/AllTests.cpp b/cpp/test/IceGrid/allocation/AllTests.cpp
index 5d0011a338d..ed50d2236d9 100644
--- a/cpp/test/IceGrid/allocation/AllTests.cpp
+++ b/cpp/test/IceGrid/allocation/AllTests.cpp
@@ -615,8 +615,8 @@ allTests(const Ice::CommunicatorPtr& communicator)
cout << "ok" << endl;
cout << "testing object allocation timeout... " << flush;
-
session1->allocateObjectById(allocatable);
+
IceUtil::Time time = IceUtil::Time::now();
session2->setAllocationTimeout(500);
try