diff -r 50a2b28ca54c -r 1b128726e887 jdk/src/share/classes/java/net/InetAddress.java --- a/jdk/src/share/classes/java/net/InetAddress.java Mon May 30 16:37:42 2011 +0100 +++ b/jdk/src/share/classes/java/net/InetAddress.java Mon May 30 23:36:10 2011 +0100 @@ -1013,6 +1013,12 @@ return InetAddress.getAllByName(host)[0]; } + // called from deployment cache manager + private static InetAddress getByName(String host, InetAddress reqAddr) + throws UnknownHostException { + return InetAddress.getAllByName(host, reqAddr)[0]; + } + /** * Given the name of a host, returns an array of its IP addresses, * based on the configured name service on the system. @@ -1054,6 +1060,11 @@ */ public static InetAddress[] getAllByName(String host) throws UnknownHostException { + return getAllByName(host, null); + } + + private static InetAddress[] getAllByName(String host, InetAddress reqAddr) + throws UnknownHostException { if (host == null || host.length() == 0) { InetAddress[] ret = new InetAddress[1]; @@ -1113,7 +1124,7 @@ // We were expecting an IPv6 Litteral, but got something else throw new UnknownHostException("["+host+"]"); } - return getAllByName0(host); + return getAllByName0(host, reqAddr, true); } /** @@ -1174,6 +1185,12 @@ */ static InetAddress[] getAllByName0 (String host, boolean check) throws UnknownHostException { + return getAllByName0 (host, null, check); + } + + private static InetAddress[] getAllByName0 (String host, InetAddress reqAddr, boolean check) + throws UnknownHostException { + /* If it gets here it is presumed to be a hostname */ /* Cache.get can return: null, unknownAddress, or InetAddress[] */ @@ -1191,7 +1208,7 @@ /* If no entry in cache, then do the host lookup */ if (addresses == null) { - addresses = getAddressesFromNameService(host); + addresses = getAddressesFromNameService(host, reqAddr); } if (addresses == unknown_array) @@ -1200,7 +1217,7 @@ return addresses.clone(); } - private static InetAddress[] getAddressesFromNameService(String host) + private static InetAddress[] getAddressesFromNameService(String host, InetAddress reqAddr) throws UnknownHostException { InetAddress[] addresses = null; @@ -1256,10 +1273,32 @@ } } - // Cache the addresses. + // More to do? + if (reqAddr != null && addresses.length > 1 && !addresses[0].equals(reqAddr)) { + // Find it? + int i = 1; + for (; i < addresses.length; i++) { + if (addresses[i].equals(reqAddr)) { + break; + } + } + // Rotate + if (i < addresses.length) { + InetAddress tmp, tmp2 = reqAddr; + for (int j = 0; j < i; j++) { + tmp = addresses[j]; + addresses[j] = tmp2; + tmp2 = tmp; + } + addresses[i] = tmp2; + } + } + // Cache the address. cacheAddresses(host, addresses, success); + if (!success && ex != null) throw ex; + } finally { // Delete host from the lookupTable and notify // all threads waiting on the lookupTable monitor. @@ -1393,7 +1432,7 @@ InetAddress[] localAddrs; try { localAddrs = - InetAddress.getAddressesFromNameService(local); + InetAddress.getAddressesFromNameService(local, null); } catch (UnknownHostException uhe) { // Rethrow with a more informative error message. UnknownHostException uhe2 =