summaryrefslogtreecommitdiff
path: root/java-compat/src
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2017-06-27 19:44:29 +0200
committerBenoit Foucher <benoit@zeroc.com>2017-06-27 19:44:29 +0200
commit53c4362f0810319cfd5f4b1d7df40e43fe701911 (patch)
tree35f415e462d1c28fd346aaf2c3aefeae08039ca1 /java-compat/src
parentICE-8162 - Compatibility fix for PHP 7.2 (diff)
downloadice-53c4362f0810319cfd5f4b1d7df40e43fe701911.tar.bz2
ice-53c4362f0810319cfd5f4b1d7df40e43fe701911.tar.xz
ice-53c4362f0810319cfd5f4b1d7df40e43fe701911.zip
Fixed ICE-8157 - ignore responses from old requests and removed duplicated proxies for replica groups
Diffstat (limited to 'java-compat/src')
-rw-r--r--java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupI.java33
-rw-r--r--java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupReplyI.java4
-rw-r--r--java-compat/src/IceDiscovery/src/main/java/IceDiscovery/PluginI.java5
3 files changed, 31 insertions, 11 deletions
diff --git a/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupI.java b/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupI.java
index e5a35ee7bfd..4c533d4d869 100644
--- a/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupI.java
+++ b/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupI.java
@@ -11,6 +11,8 @@ package IceDiscovery;
import java.util.List;
import java.util.ArrayList;
+import java.util.Set;
+import java.util.HashSet;
import java.util.Map;
import java.util.HashMap;
@@ -21,6 +23,7 @@ class LookupI extends _LookupDisp
Request(T id, int retryCount)
{
_id = id;
+ _requestId = java.util.UUID.randomUUID().toString();
_retryCount = retryCount;
}
@@ -48,9 +51,12 @@ class LookupI extends _LookupDisp
{
_lookupCount = lookups.size();
_failureCount = 0;
+ final Ice.Identity id = new Ice.Identity(_requestId, "");
for(Map.Entry<LookupPrx, LookupReplyPrx> entry : lookups.entrySet())
{
- invokeWithLookup(domainId, entry.getKey(), entry.getValue());
+ invokeWithLookup(domainId,
+ entry.getKey(),
+ LookupReplyPrxHelper.uncheckedCast(entry.getValue().ice_identity(id)));
}
}
@@ -65,6 +71,12 @@ class LookupI extends _LookupDisp
return false;
}
+ String
+ getRequestId()
+ {
+ return _requestId;
+ }
+
void
scheduleTimer(long timeout)
{
@@ -83,6 +95,8 @@ class LookupI extends _LookupDisp
abstract protected void invokeWithLookup(String domainId, LookupPrx lookup, LookupReplyPrx lookupReply);
+ private final String _requestId;
+
protected int _retryCount;
protected int _lookupCount;
protected int _failureCount;
@@ -140,7 +154,7 @@ class LookupI extends _LookupDisp
}
else if(_proxies.size() == 1)
{
- sendResponse(_proxies.get(0));
+ sendResponse(_proxies.toArray(new Ice.ObjectPrx[1])[0]);
return;
}
@@ -196,7 +210,12 @@ class LookupI extends _LookupDisp
_callbacks.clear();
}
- private List<Ice.ObjectPrx> _proxies = new ArrayList<Ice.ObjectPrx>();
+ //
+ // We use a set because the same IceDiscovery plugin might return multiple times
+ // the same proxy if it's accessible through multiple network interfaces and if we
+ // also sent the request to multiple interfaces.
+ //
+ private Set<Ice.ObjectPrx> _proxies = new HashSet<Ice.ObjectPrx>();
private long _start;
private long _latency;
};
@@ -413,10 +432,10 @@ class LookupI extends _LookupDisp
}
synchronized void
- foundObject(Ice.Identity id, Ice.ObjectPrx proxy)
+ foundObject(Ice.Identity id, String requestId, Ice.ObjectPrx proxy)
{
ObjectRequest request = _objectRequests.get(id);
- if(request == null)
+ if(request == null || !request.getRequestId().equals(requestId)) // Ignore responses from old requests
{
return;
}
@@ -427,10 +446,10 @@ class LookupI extends _LookupDisp
}
synchronized void
- foundAdapter(String adapterId, Ice.ObjectPrx proxy, boolean isReplicaGroup)
+ foundAdapter(String adapterId, String requestId, Ice.ObjectPrx proxy, boolean isReplicaGroup)
{
AdapterRequest request = _adapterRequests.get(adapterId);
- if(request == null)
+ if(request == null || !request.getRequestId().equals(requestId)) // Ignore responses from old requests
{
return;
}
diff --git a/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupReplyI.java b/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupReplyI.java
index a86fde17638..11ad40b91d0 100644
--- a/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupReplyI.java
+++ b/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/LookupReplyI.java
@@ -20,14 +20,14 @@ class LookupReplyI extends _LookupReplyDisp
public void
foundObjectById(Ice.Identity id, Ice.ObjectPrx proxy, Ice.Current current)
{
- _lookup.foundObject(id, proxy);
+ _lookup.foundObject(id, current.id.name, proxy);
}
@Override
public void
foundAdapterById(String adapterId, Ice.ObjectPrx proxy, boolean isReplicaGroup, Ice.Current current)
{
- _lookup.foundAdapter(adapterId, proxy, isReplicaGroup);
+ _lookup.foundAdapter(adapterId, current.id.name, proxy, isReplicaGroup);
}
private final LookupI _lookup;
diff --git a/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/PluginI.java b/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/PluginI.java
index 61bf4f0e6a4..6d5f664a9d5 100644
--- a/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/PluginI.java
+++ b/java-compat/src/IceDiscovery/src/main/java/IceDiscovery/PluginI.java
@@ -95,8 +95,9 @@ public class PluginI implements Ice.Plugin
LookupI lookup = new LookupI(locatorRegistry, LookupPrxHelper.uncheckedCast(lookupPrx), properties);
_multicastAdapter.add(lookup, Ice.Util.stringToIdentity("IceDiscovery/Lookup"));
- Ice.ObjectPrx lookupReply = _replyAdapter.addWithUUID(new LookupReplyI(lookup)).ice_datagram();
- lookup.setLookupReply(LookupReplyPrxHelper.uncheckedCast(lookupReply));
+ _replyAdapter.addDefaultServant(new LookupReplyI(lookup), "");
+ final Ice.Identity id = new Ice.Identity("dummy", "");
+ lookup.setLookupReply(LookupReplyPrxHelper.uncheckedCast(_replyAdapter.createProxy(id).ice_datagram()));
//
// Setup locator on the communicator.