diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-27 12:38:52 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-27 12:38:52 +0200 |
commit | 671688eaf067489b17f2af91a0fc4637face2d56 (patch) | |
tree | d62649bb53689a86aeb25c4d00746550a51c1dab /vespajlib | |
parent | ccbb150453c662f15f1cb7dc8541b816218a28b5 (diff) |
Minimize resolution checks
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/net/LinuxInetAddress.java | 57 | ||||
-rwxr-xr-x | vespajlib/src/test/java/com/yahoo/net/LinuxInetAddressTestCase.java | 2 |
2 files changed, 28 insertions, 31 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/net/LinuxInetAddress.java b/vespajlib/src/main/java/com/yahoo/net/LinuxInetAddress.java index c09b206ae54..6943723576f 100644 --- a/vespajlib/src/main/java/com/yahoo/net/LinuxInetAddress.java +++ b/vespajlib/src/main/java/com/yahoo/net/LinuxInetAddress.java @@ -28,38 +28,36 @@ public class LinuxInetAddress { * * @return a localhost address */ + // Note: Checking resolvability of ipV6 addresses takes a long time on some systems (over 5 seconds + // for some addresses on my mac). This method is written to minimize the number of resolution checks done + // and to defer ip6 checks until necessary. public static InetAddress getLocalHost() { - System.out.println("Resolving local address"); InetAddress fallback = InetAddress.getLoopbackAddress(); try { - InetAddress localAddress = InetAddress.getLocalHost(); - fallback = localAddress; + fallback = InetAddress.getLocalHost(); List<InetAddress> nonLoopback = getAllLocalFromNetwork().stream().filter(a -> ! a.isLoopbackAddress()).collect(Collectors.toList()); - if (nonLoopback.isEmpty()) { - System.out.println("Returning fallback 1: " + fallback); - return fallback; - } - fallback = nonLoopback.get(0); - List<InetAddress> resolving = - nonLoopback.stream().filter(a -> doesResolve(a)).collect(Collectors.toList()); - if (resolving.isEmpty()) { - System.out.println("Returning fallback 2: " + fallback); - return fallback; - } - fallback = resolving.get(0); - List<InetAddress> ipV4 = - resolving.stream().filter(a -> a instanceof Inet4Address).collect(Collectors.toList()); - if (ipV4.isEmpty()) { - System.out.println("Returning fallback 3: " + fallback); - return fallback; - } - System.out.println("Returning first ipv4, " + ipV4.get(0) + " among:"); - for (InetAddress choice : ipV4) - System.out.println(" " + choice); - return ipV4.get(0); + if (nonLoopback.isEmpty()) return fallback; + + // Invariant: We got all addresses without exception + + List<InetAddress> ipV4 = nonLoopback.stream().filter(a -> a instanceof Inet4Address).collect(Collectors.toList()); + for (InetAddress address : ipV4) + if (doesResolve(address)) + return address; + + // Invariant: There are no resolving ip4 addresses + + List<InetAddress> ipV6 = nonLoopback.stream().filter(a -> a instanceof Inet4Address).collect(Collectors.toList()); + for (InetAddress address : ipV6) + if (doesResolve(address)) + return address; + + // Invariant: There are no resolving ip6 addresses either + + if (! ipV4.isEmpty()) return ipV4.get(0); + return ipV6.get(0); } catch (UnknownHostException e) { - System.out.println("Returning fallback from exception " + e); return fallback; } } @@ -94,10 +92,9 @@ public class LinuxInetAddress { } } - private static boolean doesResolve(InetAddress addr) { - String asAddr = addr.getHostAddress(); - String asName = addr.getCanonicalHostName(); - return ! asAddr.equals(asName); + private static boolean doesResolve(InetAddress address) { + // The latter returns a name if resolvable to one and the host address otherwise + return ! address.getHostAddress().equals(address.getCanonicalHostName()); } } diff --git a/vespajlib/src/test/java/com/yahoo/net/LinuxInetAddressTestCase.java b/vespajlib/src/test/java/com/yahoo/net/LinuxInetAddressTestCase.java index fc1945d2d39..f5da8b8bfa7 100755 --- a/vespajlib/src/test/java/com/yahoo/net/LinuxInetAddressTestCase.java +++ b/vespajlib/src/test/java/com/yahoo/net/LinuxInetAddressTestCase.java @@ -6,7 +6,7 @@ import java.net.InetAddress; import java.net.Inet4Address;
/**
- * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author Simon Thoresen
*/
public class LinuxInetAddressTestCase extends junit.framework.TestCase {
|