summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-27 12:38:52 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-27 12:38:52 +0200
commit671688eaf067489b17f2af91a0fc4637face2d56 (patch)
treed62649bb53689a86aeb25c4d00746550a51c1dab /vespajlib
parentccbb150453c662f15f1cb7dc8541b816218a28b5 (diff)
Minimize resolution checks
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/net/LinuxInetAddress.java57
-rwxr-xr-xvespajlib/src/test/java/com/yahoo/net/LinuxInetAddressTestCase.java2
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 {