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-compat/src | |
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-compat/src')
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. |