summaryrefslogtreecommitdiff
path: root/java
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
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')
-rw-r--r--java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupI.java33
-rw-r--r--java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupReplyI.java4
-rw-r--r--java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/PluginI.java5
3 files changed, 31 insertions, 11 deletions
diff --git a/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupI.java b/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupI.java
index f223bfd87b4..e46d01ffdcf 100644
--- a/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupI.java
+++ b/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupI.java
@@ -11,6 +11,8 @@ package com.zeroc.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;
import java.util.concurrent.CompletableFuture;
@@ -22,6 +24,7 @@ class LookupI implements Lookup
Request(T id, int retryCount)
{
_id = id;
+ _requestId = java.util.UUID.randomUUID().toString();
_retryCount = retryCount;
}
@@ -45,9 +48,12 @@ class LookupI implements Lookup
{
_lookupCount = lookups.size();
_failureCount = 0;
+ final com.zeroc.Ice.Identity id = new com.zeroc.Ice.Identity(_requestId, "");
for(Map.Entry<LookupPrx, LookupReplyPrx> entry : lookups.entrySet())
{
- invokeWithLookup(domainId, entry.getKey(), entry.getValue());
+ invokeWithLookup(domainId,
+ entry.getKey(),
+ LookupReplyPrx.uncheckedCast(entry.getValue().ice_identity(id)));
}
}
@@ -61,6 +67,11 @@ class LookupI implements Lookup
return false;
}
+ String getRequestId()
+ {
+ return _requestId;
+ }
+
void scheduleTimer(long timeout)
{
_future = _timer.schedule(this, timeout, java.util.concurrent.TimeUnit.MILLISECONDS);
@@ -77,6 +88,8 @@ class LookupI implements Lookup
abstract protected void invokeWithLookup(String domainId, LookupPrx lookup, LookupReplyPrx lookupReply);
+ private final String _requestId;
+
protected int _retryCount;
protected int _lookupCount;
protected int _failureCount;
@@ -131,7 +144,7 @@ class LookupI implements Lookup
}
else if(_proxies.size() == 1)
{
- sendResponse(_proxies.get(0));
+ sendResponse(_proxies.toArray(new com.zeroc.Ice.ObjectPrx[1])[0]);
return;
}
@@ -174,7 +187,12 @@ class LookupI implements Lookup
_futures.clear();
}
- private List<com.zeroc.Ice.ObjectPrx> _proxies = new ArrayList<>();
+ //
+ // 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<com.zeroc.Ice.ObjectPrx> _proxies = new HashSet<>();
private long _start;
private long _latency;
}
@@ -370,10 +388,10 @@ class LookupI implements Lookup
}
}
- synchronized void foundObject(com.zeroc.Ice.Identity id, com.zeroc.Ice.ObjectPrx proxy)
+ synchronized void foundObject(com.zeroc.Ice.Identity id, String requestId, com.zeroc.Ice.ObjectPrx proxy)
{
ObjectRequest request = _objectRequests.get(id);
- if(request == null)
+ if(request == null || !request.getRequestId().equals(requestId)) // Ignore responses from old requests
{
return;
}
@@ -383,10 +401,11 @@ class LookupI implements Lookup
_objectRequests.remove(id);
}
- synchronized void foundAdapter(String adapterId, com.zeroc.Ice.ObjectPrx proxy, boolean isReplicaGroup)
+ synchronized void foundAdapter(String adapterId, String requestId, com.zeroc.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/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupReplyI.java b/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupReplyI.java
index fac4e5b139d..55a6540c501 100644
--- a/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupReplyI.java
+++ b/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/LookupReplyI.java
@@ -19,14 +19,14 @@ class LookupReplyI implements LookupReply
@Override
public void foundObjectById(com.zeroc.Ice.Identity id, com.zeroc.Ice.ObjectPrx proxy, com.zeroc.Ice.Current current)
{
- _lookup.foundObject(id, proxy);
+ _lookup.foundObject(id, current.id.name, proxy);
}
@Override
public void foundAdapterById(String adapterId, com.zeroc.Ice.ObjectPrx proxy, boolean isReplicaGroup,
com.zeroc.Ice.Current current)
{
- _lookup.foundAdapter(adapterId, proxy, isReplicaGroup);
+ _lookup.foundAdapter(adapterId, current.id.name, proxy, isReplicaGroup);
}
private final LookupI _lookup;
diff --git a/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/PluginI.java b/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/PluginI.java
index ee0721b4e76..3904d7027a0 100644
--- a/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/PluginI.java
+++ b/java/src/IceDiscovery/src/main/java/com/zeroc/IceDiscovery/PluginI.java
@@ -95,8 +95,9 @@ public class PluginI implements com.zeroc.Ice.Plugin
LookupI lookup = new LookupI(locatorRegistry, LookupPrx.uncheckedCast(lookupPrx), properties);
_multicastAdapter.add(lookup, com.zeroc.Ice.Util.stringToIdentity("IceDiscovery/Lookup"));
- com.zeroc.Ice.ObjectPrx lookupReply = _replyAdapter.addWithUUID(new LookupReplyI(lookup)).ice_datagram();
- lookup.setLookupReply(LookupReplyPrx.uncheckedCast(lookupReply));
+ _replyAdapter.addDefaultServant(new LookupReplyI(lookup), "");
+ final com.zeroc.Ice.Identity id = new com.zeroc.Ice.Identity("dummy", "");
+ lookup.setLookupReply(LookupReplyPrx.uncheckedCast(_replyAdapter.createProxy(id).ice_datagram()));
//
// Setup locator on the communicator.