HDFS-13795. Fix potential NPE in InMemoryLevelDBAliasMapServer.
This commit is contained in:
parent
0a71bf1452
commit
15241c6349
|
@ -167,6 +167,9 @@ public class InMemoryAliasMapProtocolClientSideTranslatorPB
|
|||
public Optional<ProvidedStorageLocation> read(@Nonnull Block block)
|
||||
throws IOException {
|
||||
|
||||
if (block == null) {
|
||||
throw new IOException("Block cannot be null");
|
||||
}
|
||||
ReadRequestProto request =
|
||||
ReadRequestProto
|
||||
.newBuilder()
|
||||
|
@ -191,6 +194,9 @@ public class InMemoryAliasMapProtocolClientSideTranslatorPB
|
|||
public void write(@Nonnull Block block,
|
||||
@Nonnull ProvidedStorageLocation providedStorageLocation)
|
||||
throws IOException {
|
||||
if (block == null || providedStorageLocation == null) {
|
||||
throw new IOException("Provided block and location cannot be null");
|
||||
}
|
||||
WriteRequestProto request =
|
||||
WriteRequestProto
|
||||
.newBuilder()
|
||||
|
|
|
@ -150,11 +150,15 @@ public class InMemoryLevelDBAliasMapServer implements InMemoryAliasMapProtocol,
|
|||
public void close() {
|
||||
LOG.info("Stopping InMemoryLevelDBAliasMapServer");
|
||||
try {
|
||||
aliasMap.close();
|
||||
if (aliasMap != null) {
|
||||
aliasMap.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOG.error(e.getMessage());
|
||||
}
|
||||
aliasMapServer.stop();
|
||||
if (aliasMapServer != null) {
|
||||
aliasMapServer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,14 +28,19 @@ import org.apache.hadoop.hdfs.server.aliasmap.InMemoryAliasMap;
|
|||
import org.apache.hadoop.hdfs.server.aliasmap.InMemoryLevelDBAliasMapServer;
|
||||
import org.apache.hadoop.hdfs.server.common.blockaliasmap.BlockAliasMap;
|
||||
import org.apache.hadoop.hdfs.server.common.FileRegion;
|
||||
import org.apache.hadoop.test.LambdaTestUtils;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_SERVICE_RPC_BIND_HOST_KEY;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
@ -59,6 +64,9 @@ public class TestInMemoryLevelDBAliasMapClient {
|
|||
private Configuration conf;
|
||||
private final static String BPID = "BPID-0";
|
||||
|
||||
@Rule
|
||||
public final ExpectedException exception = ExpectedException.none();
|
||||
|
||||
@Before
|
||||
public void setUp() throws IOException {
|
||||
conf = new Configuration();
|
||||
|
@ -348,4 +356,35 @@ public class TestInMemoryLevelDBAliasMapClient {
|
|||
conf.set(DFS_NAMENODE_SERVICE_RPC_BIND_HOST_KEY, "0.0.0.0");
|
||||
writeRead();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNonExistentFile() throws Exception {
|
||||
// delete alias map location
|
||||
FileUtils.deleteDirectory(tempDir);
|
||||
// expect a RuntimeException when the aliasmap is started.
|
||||
exception.expect(RuntimeException.class);
|
||||
levelDBAliasMapServer.setConf(conf);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNonExistentBlock() throws Exception {
|
||||
inMemoryLevelDBAliasMapClient.setConf(conf);
|
||||
levelDBAliasMapServer.setConf(conf);
|
||||
levelDBAliasMapServer.start();
|
||||
Block block1 = new Block(100, 43, 44);
|
||||
ProvidedStorageLocation providedStorageLocation1 = null;
|
||||
BlockAliasMap.Writer<FileRegion> writer1 =
|
||||
inMemoryLevelDBAliasMapClient.getWriter(null, BPID);
|
||||
try {
|
||||
writer1.store(new FileRegion(block1, providedStorageLocation1));
|
||||
fail("Should fail on writing a region with null ProvidedLocation");
|
||||
} catch (IOException | IllegalArgumentException e) {
|
||||
assertTrue(e.getMessage().contains("not be null"));
|
||||
}
|
||||
|
||||
BlockAliasMap.Reader<FileRegion> reader =
|
||||
inMemoryLevelDBAliasMapClient.getReader(null, BPID);
|
||||
LambdaTestUtils.assertOptionalUnset("Expected empty BlockAlias",
|
||||
reader.resolve(block1));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue