diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 358d808069..fe1bf4f9c5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -269,6 +269,9 @@ Trunk (Unreleased) 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) + 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 INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java index c8544f7256..93bf5ff0ab 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java @@ -633,7 +633,9 @@ public class DatanodeManager { // Mostly called inside an RPC, update ip and peer hostname String hostname = dnAddress.getHostName(); 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); throw new DisallowedDatanodeException(nodeReg); } @@ -1061,6 +1063,22 @@ public class DatanodeManager { } 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) { node.setLastUpdate(0);