diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java index 4c43d388733..6d151ba251a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/web/resources/NamenodeWebHdfsMethods.java @@ -270,11 +270,21 @@ public class NamenodeWebHdfsMethods { for (String host : StringUtils .getTrimmedStringCollection(excludeDatanodes)) { int idx = host.indexOf(":"); - if (idx != -1) { - excludes.add(bm.getDatanodeManager().getDatanodeByXferAddr( - host.substring(0, idx), Integer.parseInt(host.substring(idx + 1)))); + Node excludeNode = null; + if (idx != -1) { + excludeNode = bm.getDatanodeManager().getDatanodeByXferAddr( + host.substring(0, idx), Integer.parseInt(host.substring(idx + 1))); } else { - excludes.add(bm.getDatanodeManager().getDatanodeByHost(host)); + excludeNode = bm.getDatanodeManager().getDatanodeByHost(host); + } + + if (excludeNode != null) { + excludes.add(excludeNode); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("DataNode " + host + " was requested to be excluded, " + + "but it was not found."); + } } } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/web/resources/TestWebHdfsDataLocality.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/web/resources/TestWebHdfsDataLocality.java index d00ed62a0a5..1d57155620e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/web/resources/TestWebHdfsDataLocality.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/web/resources/TestWebHdfsDataLocality.java @@ -238,6 +238,29 @@ public class TestWebHdfsDataLocality { } } + @Test + public void testExcludeWrongDataNode() throws Exception { + final Configuration conf = WebHdfsTestUtil.createConf(); + final String[] racks = {RACK0}; + final String[] hosts = {"DataNode1"}; + final int nDataNodes = hosts.length; + + final MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf) + .hosts(hosts).numDataNodes(nDataNodes).racks(racks).build(); + try { + cluster.waitActive(); + final NameNode namenode = cluster.getNameNode(); + NamenodeWebHdfsMethods.chooseDatanode( + namenode, "/path", PutOpParam.Op.CREATE, 0, + DFSConfigKeys.DFS_BLOCK_SIZE_DEFAULT, + "DataNode2", LOCALHOST, null); + } catch (Exception e) { + Assert.fail("Failed to exclude DataNode2" + e.getMessage()); + } finally { + cluster.shutdown(); + } + } + @Test public void testChooseDatanodeBeforeNamesystemInit() throws Exception { NameNode nn = mock(NameNode.class);