Fix for TcpDiscoverySharedFsIpFinder to work with IPv6 addresses. - Fixes #495.
Signed-off-by: shtykh_roman <rsht...@yahoo.com> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/41a8e7e1 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/41a8e7e1 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/41a8e7e1 Branch: refs/heads/ignite-2407 Commit: 41a8e7e185d984715dd98bcc8d3cc0c415b8f2e1 Parents: eb5bce2 Author: shtykh_roman <rsht...@yahoo.com> Authored: Wed Feb 24 11:54:17 2016 +0900 Committer: shtykh_roman <rsht...@yahoo.com> Committed: Wed Feb 24 11:54:17 2016 +0900 ---------------------------------------------------------------------- .../sharedfs/TcpDiscoverySharedFsIpFinder.java | 35 +++++++++++++++++--- .../TcpDiscoveryIpFinderAbstractSelfTest.java | 15 +++++---- 2 files changed, 40 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/41a8e7e1/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/sharedfs/TcpDiscoverySharedFsIpFinder.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/sharedfs/TcpDiscoverySharedFsIpFinder.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/sharedfs/TcpDiscoverySharedFsIpFinder.java index 596d93f..e7fde76 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/sharedfs/TcpDiscoverySharedFsIpFinder.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ipfinder/sharedfs/TcpDiscoverySharedFsIpFinder.java @@ -71,6 +71,12 @@ public class TcpDiscoverySharedFsIpFinder extends TcpDiscoveryIpFinderAdapter { /** Delimiter to use between address and port tokens in file names. */ public static final String DELIM = "#"; + /** IPv6 colon delimiter. */ + private static final String COLON_DELIM = ":"; + + /** IPv6 colon substitute. */ + private static final String COLON_SUBST = "_"; + /** Grid logger. */ @LoggerResource private IgniteLogger log; @@ -198,7 +204,7 @@ public class TcpDiscoverySharedFsIpFinder extends TcpDiscoveryIpFinderAdapter { try { int port = Integer.parseInt(portStr); - addr = new InetSocketAddress(addrStr, port); + addr = new InetSocketAddress(denormalizeAddress(addrStr), port); } catch (IllegalArgumentException e) { U.error(log, "Failed to parse file entry: " + fileName, e); @@ -240,7 +246,8 @@ public class TcpDiscoverySharedFsIpFinder extends TcpDiscoveryIpFinderAdapter { for (InetSocketAddress addr : addrs) { File file = new File(folder, name(addr)); - file.delete(); + if (!file.delete()) + throw new IgniteSpiException("Failed to delete file " + file.getName()); } } catch (SecurityException e) { @@ -259,15 +266,35 @@ public class TcpDiscoverySharedFsIpFinder extends TcpDiscoveryIpFinderAdapter { SB sb = new SB(); - sb.a(addr.getAddress().getHostAddress()) + sb.a(normalizeAddress(addr.getAddress().getHostAddress())) .a(DELIM) .a(addr.getPort()); return sb.toString(); } + /** + * Normalizes the host address by substituting colon delimiter with underscore. + * + * @param hostAddress Host address. + * @return Normalized host address that can be safely used in file names. + */ + private String normalizeAddress(String hostAddress){ + return hostAddress.replaceAll(COLON_DELIM, COLON_SUBST); + } + + /** + * Reverts changes done with {@link TcpDiscoverySharedFsIpFinder#normalizeAddress}. + * + * @param hostAddress Host address. + * @return Standard host address. + */ + private String denormalizeAddress(String hostAddress){ + return hostAddress.replaceAll(COLON_SUBST, COLON_DELIM); + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(TcpDiscoverySharedFsIpFinder.class, this); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/ignite/blob/41a8e7e1/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java index 06aadda..6f2201f 100644 --- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java @@ -18,6 +18,7 @@ package org.apache.ignite.spi.discovery.tcp.ipfinder; import java.lang.reflect.Field; +import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.Arrays; @@ -61,8 +62,10 @@ public abstract class TcpDiscoveryIpFinderAbstractSelfTest<T extends TcpDiscover InetSocketAddress node1 = new InetSocketAddress(InetAddress.getLocalHost(), 1000); InetSocketAddress node2 = new InetSocketAddress(InetAddress.getLocalHost(), 1001); + InetSocketAddress node3 = new InetSocketAddress( + Inet6Address.getByName("2001:0db8:85a3:08d3:1319:47ff:fe3b:7fd3"), 1002); - List<InetSocketAddress> initAddrs = Arrays.asList(node1, node2); + List<InetSocketAddress> initAddrs = Arrays.asList(node1, node2, node3); finder.registerAddresses(Collections.singletonList(node1)); @@ -70,13 +73,13 @@ public abstract class TcpDiscoveryIpFinderAbstractSelfTest<T extends TcpDiscover Collection<InetSocketAddress> addrs = finder.getRegisteredAddresses(); - for (int i = 0; i < 5 && addrs.size() != 2; i++) { + for (int i = 0; i < 5 && addrs.size() != 3; i++) { U.sleep(1000); addrs = finder.getRegisteredAddresses(); } - assertEquals("Wrong collection size", 2, addrs.size()); + assertEquals("Wrong collection size", 3, addrs.size()); for (InetSocketAddress addr : initAddrs) assert addrs.contains(addr) : "Address is missing (got inconsistent addrs collection): " + addr; @@ -85,13 +88,13 @@ public abstract class TcpDiscoveryIpFinderAbstractSelfTest<T extends TcpDiscover addrs = finder.getRegisteredAddresses(); - for (int i = 0; i < 5 && addrs.size() != 1; i++) { + for (int i = 0; i < 5 && addrs.size() != 2; i++) { U.sleep(1000); addrs = finder.getRegisteredAddresses(); } - assertEquals("Wrong collection size", 1, addrs.size()); + assertEquals("Wrong collection size", 2, addrs.size()); finder.unregisterAddresses(finder.getRegisteredAddresses()); @@ -125,4 +128,4 @@ public abstract class TcpDiscoveryIpFinderAbstractSelfTest<T extends TcpDiscover * @throws Exception If any error occurs. */ protected abstract T ipFinder() throws Exception; -} \ No newline at end of file +}