diff options
author | Benoit Foucher <benoit@zeroc.com> | 2017-06-27 19:44:29 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2017-06-27 19:44:29 +0200 |
commit | 53c4362f0810319cfd5f4b1d7df40e43fe701911 (patch) | |
tree | 35f415e462d1c28fd346aaf2c3aefeae08039ca1 /java | |
parent | ICE-8162 - Compatibility fix for PHP 7.2 (diff) | |
download | ice-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')
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. |