ignite-4577 Add non-reachable addresses at the end of addresses list
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7ad8e79f Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7ad8e79f Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7ad8e79f Branch: refs/heads/ignite-1192 Commit: 7ad8e79fa1077291c50f2f535ecccde6baee0321 Parents: a30183a Author: Evgenii Zhuravlev <ezhurav...@gridgain.com> Authored: Tue Mar 7 14:32:28 2017 +0300 Committer: Evgenii Zhuravlev <ezhurav...@gridgain.com> Committed: Tue Mar 7 14:41:38 2017 +0300 ---------------------------------------------------------------------- .../ignite/internal/util/IgniteUtils.java | 14 ++++++----- .../communication/tcp/TcpCommunicationSpi.java | 25 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/7ad8e79f/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index 3fa3f7b..ba118cb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -1810,15 +1810,16 @@ public abstract class IgniteUtils { /** * @param addrs Addresses. + * @return List of reachable addresses. */ - public static List<InetAddress> filterReachable(List<InetAddress> addrs) { + public static List<InetAddress> filterReachable(Collection<InetAddress> addrs) { final int reachTimeout = 2000; if (addrs.isEmpty()) return Collections.emptyList(); if (addrs.size() == 1) { - InetAddress addr = addrs.get(0); + InetAddress addr = F.first(addrs); if (reachable(addr, reachTimeout)) return Collections.singletonList(addr); @@ -1834,8 +1835,7 @@ public abstract class IgniteUtils { for (final InetAddress addr : addrs) { futs.add(executor.submit(new Runnable() { - @Override - public void run() { + @Override public void run() { if (reachable(addr, reachTimeout)) { synchronized (res) { res.add(addr); @@ -1848,11 +1848,13 @@ public abstract class IgniteUtils { for (Future<?> fut : futs) { try { fut.get(); - } catch (InterruptedException e) { + } + catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IgniteException("Thread has been interrupted.", e); - } catch (ExecutionException e) { + } + catch (ExecutionException e) { throw new IgniteException(e); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/7ad8e79f/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java index 94b7efe..81454f8 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java @@ -2334,6 +2334,31 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter if (isExtAddrsExist) addrs.addAll(extAddrs); + Set<InetAddress> allInetAddrs = U.newHashSet(addrs.size()); + + for (InetSocketAddress addr : addrs) + allInetAddrs.add(addr.getAddress()); + + List<InetAddress> reachableInetAddrs = U.filterReachable(allInetAddrs); + + if (reachableInetAddrs.size() < allInetAddrs.size()) { + LinkedHashSet<InetSocketAddress> addrs0 = U.newLinkedHashSet(addrs.size()); + + for (InetSocketAddress addr : addrs) { + if (reachableInetAddrs.contains(addr.getAddress())) + addrs0.add(addr); + } + for (InetSocketAddress addr : addrs) { + if (!reachableInetAddrs.contains(addr.getAddress())) + addrs0.add(addr); + } + + addrs = addrs0; + } + + if (log.isDebugEnabled()) + log.debug("Addresses to connect for node [rmtNode=" + node.id() + ", addrs=" + addrs.toString() + ']'); + boolean conn = false; GridCommunicationClient client = null; IgniteCheckedException errs = null;