summaryrefslogtreecommitdiff
path: root/cpp/src/IceLocatorDiscovery
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2015-03-10 16:11:49 +0100
committerBenoit Foucher <benoit@zeroc.com>2015-03-10 16:11:49 +0100
commitc53ac81f746ec2fb4c5783fe0637560be3e5a6bf (patch)
treef15db862b19252b691459b71a265ae4f01a8ace1 /cpp/src/IceLocatorDiscovery
parentICE-6170 - fixed behavior of batch requests (diff)
downloadice-c53ac81f746ec2fb4c5783fe0637560be3e5a6bf.tar.bz2
ice-c53ac81f746ec2fb4c5783fe0637560be3e5a6bf.tar.xz
ice-c53ac81f746ec2fb4c5783fe0637560be3e5a6bf.zip
Fixed ICE-6362 : fixed IceLocatorDiscovery infinite retry
Diffstat (limited to 'cpp/src/IceLocatorDiscovery')
-rw-r--r--cpp/src/IceLocatorDiscovery/PluginI.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/cpp/src/IceLocatorDiscovery/PluginI.cpp b/cpp/src/IceLocatorDiscovery/PluginI.cpp
index 798ad323974..7e391460de5 100644
--- a/cpp/src/IceLocatorDiscovery/PluginI.cpp
+++ b/cpp/src/IceLocatorDiscovery/PluginI.cpp
@@ -39,13 +39,13 @@ class Request : public IceUtil::Shared
{
public:
- Request(LocatorI* locator,
+ Request(LocatorI* locator,
const string& operation,
- Ice::OperationMode mode,
- const pair<const Ice::Byte*, const Ice::Byte*>& inParams,
+ Ice::OperationMode mode,
+ const pair<const Ice::Byte*, const Ice::Byte*>& inParams,
const Ice::Context& ctx,
const Ice::AMD_Object_ice_invokePtr& amdCB) :
- _locator(locator),
+ _locator(locator),
_operation(operation),
_mode(mode),
_context(ctx),
@@ -68,6 +68,7 @@ protected:
const Ice::AMD_Object_ice_invokePtr _amdCB;
Ice::LocatorPrx _locatorPrx;
+ IceUtil::UniquePtr<Ice::Exception> _exception;
};
typedef IceUtil::Handle<Request> RequestPtr;
@@ -134,7 +135,7 @@ const ::std::string IceGrid_Locator_ids[3] =
class VoidLocatorI : public Ice::Locator
{
public:
-
+
virtual void
findObjectById_async(const Ice::AMD_Locator_findObjectByIdPtr& amdCB,
const Ice::Identity&,
@@ -142,7 +143,7 @@ public:
{
amdCB->ice_response(0);
}
-
+
virtual void
findAdapterById_async(const Ice::AMD_Locator_findAdapterByIdPtr& amdCB,
const string&,
@@ -150,7 +151,7 @@ public:
{
amdCB->ice_response(0);
}
-
+
virtual Ice::LocatorRegistryPrx
getRegistry(const Ice::Current&) const
{
@@ -264,9 +265,17 @@ PluginI::destroy()
void
Request::invoke(const Ice::LocatorPrx& l)
{
- _locatorPrx = l;
- l->begin_ice_invoke(_operation, _mode, _inParams, _context,
- Ice::newCallback_Object_ice_invoke(this, &Request::response, &Request::exception));
+ if(l != _locatorPrx)
+ {
+ _locatorPrx = l;
+ l->begin_ice_invoke(_operation, _mode, _inParams, _context,
+ Ice::newCallback_Object_ice_invoke(this, &Request::response, &Request::exception));
+ }
+ else
+ {
+ assert(_exception.get()); // Don't retry if the proxy didn't change
+ _amdCB->ice_exception(*_exception.get());
+ }
}
void
@@ -292,6 +301,7 @@ Request::exception(const Ice::Exception& ex)
}
catch(const Ice::Exception&)
{
+ _exception.reset(ex.ice_clone());
_locator->invoke(_locatorPrx, this); // Retry with new locator proxy
}
}