HDFS-8290. WebHDFS calls before namesystem initialization can cause NullPointerException. Contributed by Chris Nauroth.
(cherry picked from commit c4578760b6
)
This commit is contained in:
parent
99b49a8181
commit
a43080a2cf
|
@ -286,6 +286,9 @@ Release 2.8.0 - UNRELEASED
|
|||
HDFS-8309. Skip unit test using DataNodeTestUtils#injectDataDirFailure() on Windows.
|
||||
(xyao)
|
||||
|
||||
HDFS-8290. WebHDFS calls before namesystem initialization can cause
|
||||
NullPointerException. (cnauroth)
|
||||
|
||||
Release 2.7.1 - UNRELEASED
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -69,6 +69,7 @@ import org.apache.hadoop.hdfs.server.blockmanagement.BlockManager;
|
|||
import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor;
|
||||
import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeStorageInfo;
|
||||
import org.apache.hadoop.hdfs.server.common.JspHelper;
|
||||
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
|
||||
import org.apache.hadoop.hdfs.server.namenode.NameNode;
|
||||
import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocols;
|
||||
import org.apache.hadoop.hdfs.web.JsonUtil;
|
||||
|
@ -164,7 +165,11 @@ public class NamenodeWebHdfsMethods {
|
|||
static DatanodeInfo chooseDatanode(final NameNode namenode,
|
||||
final String path, final HttpOpParam.Op op, final long openOffset,
|
||||
final long blocksize, final String excludeDatanodes) throws IOException {
|
||||
final BlockManager bm = namenode.getNamesystem().getBlockManager();
|
||||
FSNamesystem fsn = namenode.getNamesystem();
|
||||
if (fsn == null) {
|
||||
throw new IOException("Namesystem has not been intialized yet.");
|
||||
}
|
||||
final BlockManager bm = fsn.getBlockManager();
|
||||
|
||||
HashSet<Node> excludes = new HashSet<Node>();
|
||||
if (excludeDatanodes != null) {
|
||||
|
|
|
@ -17,6 +17,9 @@
|
|||
*/
|
||||
package org.apache.hadoop.hdfs.server.namenode.web.resources;
|
||||
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -42,7 +45,9 @@ import org.apache.hadoop.hdfs.web.resources.PostOpParam;
|
|||
import org.apache.hadoop.hdfs.web.resources.PutOpParam;
|
||||
import org.apache.log4j.Level;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
/**
|
||||
* Test WebHDFS which provides data locality using HTTP redirection.
|
||||
|
@ -57,6 +62,9 @@ public class TestWebHdfsDataLocality {
|
|||
private static final String RACK1 = "/rack1";
|
||||
private static final String RACK2 = "/rack2";
|
||||
|
||||
@Rule
|
||||
public final ExpectedException exception = ExpectedException.none();
|
||||
|
||||
@Test
|
||||
public void testDataLocality() throws Exception {
|
||||
final Configuration conf = WebHdfsTestUtil.createConf();
|
||||
|
@ -213,4 +221,14 @@ public class TestWebHdfsDataLocality {
|
|||
cluster.shutdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testChooseDatanodeBeforeNamesystemInit() throws Exception {
|
||||
NameNode nn = mock(NameNode.class);
|
||||
when(nn.getNamesystem()).thenReturn(null);
|
||||
exception.expect(IOException.class);
|
||||
exception.expectMessage("Namesystem has not been intialized yet.");
|
||||
NamenodeWebHdfsMethods.chooseDatanode(nn, "/path", PutOpParam.Op.CREATE, 0,
|
||||
DFSConfigKeys.DFS_BLOCK_SIZE_DEFAULT, null);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue