HDFS-14216. NullPointerException happens in NamenodeWebHdfs. Contributed by lujie.

(cherry picked from commit 92b53c40f0)
(cherry picked from commit 2e939515df)
This commit is contained in:
Surendra Singh Lilhore 2019-02-21 20:36:34 +05:30 committed by Wei-Chiu Chuang
parent a989779f2d
commit 7f882570d7
2 changed files with 37 additions and 4 deletions

View File

@ -270,11 +270,21 @@ public class NamenodeWebHdfsMethods {
for (String host : StringUtils for (String host : StringUtils
.getTrimmedStringCollection(excludeDatanodes)) { .getTrimmedStringCollection(excludeDatanodes)) {
int idx = host.indexOf(":"); int idx = host.indexOf(":");
if (idx != -1) { Node excludeNode = null;
excludes.add(bm.getDatanodeManager().getDatanodeByXferAddr( if (idx != -1) {
host.substring(0, idx), Integer.parseInt(host.substring(idx + 1)))); excludeNode = bm.getDatanodeManager().getDatanodeByXferAddr(
host.substring(0, idx), Integer.parseInt(host.substring(idx + 1)));
} else { } 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.");
}
} }
} }
} }

View File

@ -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 @Test
public void testChooseDatanodeBeforeNamesystemInit() throws Exception { public void testChooseDatanodeBeforeNamesystemInit() throws Exception {
NameNode nn = mock(NameNode.class); NameNode nn = mock(NameNode.class);