HDFS-4269. Datanode rejects all datanode registrations from localhost in single-node developer setup on Windows. Contributed by Chris Nauroth.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1420492 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8c2846510e
commit
f31b8270db
|
@ -269,6 +269,9 @@ Trunk (Unreleased)
|
||||||
HDFS-4260 Fix HDFS tests to set test dir to a valid HDFS path as opposed
|
HDFS-4260 Fix HDFS tests to set test dir to a valid HDFS path as opposed
|
||||||
to the local build path (Chri Nauroth via Sanjay)
|
to the local build path (Chri Nauroth via Sanjay)
|
||||||
|
|
||||||
|
HDFS-4269. Datanode rejects all datanode registrations from localhost
|
||||||
|
in single-node developer setup on Windows. (Chris Nauroth via suresh)
|
||||||
|
|
||||||
Release 2.0.3-alpha - Unreleased
|
Release 2.0.3-alpha - Unreleased
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -633,7 +633,9 @@ public class DatanodeManager {
|
||||||
// Mostly called inside an RPC, update ip and peer hostname
|
// Mostly called inside an RPC, update ip and peer hostname
|
||||||
String hostname = dnAddress.getHostName();
|
String hostname = dnAddress.getHostName();
|
||||||
String ip = dnAddress.getHostAddress();
|
String ip = dnAddress.getHostAddress();
|
||||||
if (hostname.equals(ip)) {
|
if (!isNameResolved(dnAddress)) {
|
||||||
|
// Reject registration of unresolved datanode to prevent performance
|
||||||
|
// impact of repetitive DNS lookups later.
|
||||||
LOG.warn("Unresolved datanode registration from " + ip);
|
LOG.warn("Unresolved datanode registration from " + ip);
|
||||||
throw new DisallowedDatanodeException(nodeReg);
|
throw new DisallowedDatanodeException(nodeReg);
|
||||||
}
|
}
|
||||||
|
@ -1061,6 +1063,22 @@ public class DatanodeManager {
|
||||||
}
|
}
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if name resolution was successful for the given address. If IP
|
||||||
|
* address and host name are the same, then it means name resolution has
|
||||||
|
* failed. As a special case, the loopback address is also considered
|
||||||
|
* acceptable. This is particularly important on Windows, where 127.0.0.1 does
|
||||||
|
* not resolve to "localhost".
|
||||||
|
*
|
||||||
|
* @param address InetAddress to check
|
||||||
|
* @return boolean true if name resolution successful or address is loopback
|
||||||
|
*/
|
||||||
|
private static boolean isNameResolved(InetAddress address) {
|
||||||
|
String hostname = address.getHostName();
|
||||||
|
String ip = address.getHostAddress();
|
||||||
|
return !hostname.equals(ip) || address.isLoopbackAddress();
|
||||||
|
}
|
||||||
|
|
||||||
private void setDatanodeDead(DatanodeDescriptor node) {
|
private void setDatanodeDead(DatanodeDescriptor node) {
|
||||||
node.setLastUpdate(0);
|
node.setLastUpdate(0);
|
||||||
|
|
Loading…
Reference in New Issue