Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Improvement-3690][common] Get the native IP policy problem (获取本机ip策略问题 ) #3695

Merged
merged 9 commits into from Sep 14, 2020
Expand Up @@ -89,21 +89,22 @@ private static synchronized InetAddress getLocalAddress0() {
}
InetAddress localAddress = null;
NetworkInterface networkInterface = findNetworkInterface();
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
Optional<InetAddress> addressOp = toValidAddress(addresses.nextElement());
if (addressOp.isPresent()) {
try {
if (addressOp.get().isReachable(100)) {
LOCAL_ADDRESS = addressOp.get();
return LOCAL_ADDRESS;
if (networkInterface != null) {
Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
Optional<InetAddress> addressOp = toValidAddress(addresses.nextElement());
if (addressOp.isPresent()) {
try {
if (addressOp.get().isReachable(100)) {
LOCAL_ADDRESS = addressOp.get();
return LOCAL_ADDRESS;
}
} catch (IOException e) {
logger.warn("test address id reachable io exception", e);
}
} catch (IOException e) {
logger.warn("test address id reachable io exception", e);
}
}
}

try {
localAddress = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
Expand Down Expand Up @@ -190,7 +191,7 @@ private static NetworkInterface findNetworkInterface() {
if (null != result) {
return result;
}
return validNetworkInterfaces.get(0);
return findIntranetAddress(validNetworkInterfaces);
}

/**
Expand Down Expand Up @@ -227,4 +228,32 @@ private static boolean isSpecifyNetworkInterface(NetworkInterface networkInterfa
String preferredNetworkInterface = System.getProperty(DOLPHIN_SCHEDULER_PREFERRED_NETWORK_INTERFACE);
return Objects.equals(networkInterface.getDisplayName(), preferredNetworkInterface);
}

/**
* Get the Intranet IP
*
* @return If no {@link NetworkInterface} is available , return <code>null</code>
*/
public static NetworkInterface findIntranetAddress(List<NetworkInterface> validNetworkInterfaces) {

if (validNetworkInterfaces.isEmpty()) {
return null;
}
NetworkInterface networkInterface = null;
for (NetworkInterface ni : validNetworkInterfaces) {
Enumeration<InetAddress> address = ni.getInetAddresses();
while (address.hasMoreElements()) {
InetAddress ip = address.nextElement();
if (ip.isSiteLocalAddress()
&& !ip.isLoopbackAddress()
&& !ip.getHostAddress().contains(":")) {
networkInterface = ni;
}
}
}
if (networkInterface == null) {
return validNetworkInterfaces.get(0);
}
return networkInterface;
}
}