1
0

[HUDI-3552] Strength the NetworkUtils#getHostname by checking network interfaces first (#4942)

* In some complex network environment, the current code returns wildcard address 0.0.0.0 which is not desired.
This commit is contained in:
Danny Chan
2022-03-03 21:11:08 +08:00
committed by GitHub
parent 876a891979
commit a4ba0fff07

View File

@@ -23,6 +23,10 @@ import org.apache.hudi.exception.HoodieException;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
/**
* A utility class for network.
@@ -30,6 +34,21 @@ import java.net.InetAddress;
public class NetworkUtils {
public static synchronized String getHostname() {
try {
Enumeration<NetworkInterface> networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces();
while (networkInterfaceEnumeration.hasMoreElements()) {
for (InterfaceAddress interfaceAddress : networkInterfaceEnumeration.nextElement().getInterfaceAddresses()) {
InetAddress address = interfaceAddress.getAddress();
if (!address.isLinkLocalAddress() && !address.isLoopbackAddress() && !address.isAnyLocalAddress()) {
return address.getHostAddress();
}
}
}
} catch (SocketException e) {
throw new HoodieException("Unable to find server port", e);
}
// fallback
try (DatagramSocket s = new DatagramSocket()) {
// see https://stackoverflow.com/questions/9481865/getting-the-ip-address-of-the-current-machine-using-java
// for details.