diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 36c3fe06018..07bbd360564 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1,4 +1,4 @@ -Hadoop HDFS Change Log + Hadoop HDFS Change Log Release 2.8.0 - UNRELEASED @@ -454,6 +454,9 @@ Release 2.8.0 - UNRELEASED HDFS-8403. Eliminate retries in TestFileCreation #testOverwriteOpenForWrite. (Arpit Agarwal via wheat9) + HDFS-6348. SecondaryNameNode not terminating properly on runtime exceptions + (Rakesh R via vinayakumarb) + Release 2.7.1 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java index b499e74dc22..0fa1cd50000 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java @@ -667,29 +667,28 @@ public static void main(String[] argv) throws Exception { opts.usage(); System.exit(0); } - - StringUtils.startupShutdownMessage(SecondaryNameNode.class, argv, LOG); - Configuration tconf = new HdfsConfiguration(); - SecondaryNameNode secondary = null; + try { + StringUtils.startupShutdownMessage(SecondaryNameNode.class, argv, LOG); + Configuration tconf = new HdfsConfiguration(); + SecondaryNameNode secondary = null; secondary = new SecondaryNameNode(tconf, opts); - } catch (IOException ioe) { - LOG.fatal("Failed to start secondary namenode", ioe); + + if (opts != null && opts.getCommand() != null) { + int ret = secondary.processStartupCommand(opts); + terminate(ret); + } + + if (secondary != null) { + secondary.startCheckpointThread(); + secondary.join(); + } + } catch (Throwable e) { + LOG.fatal("Failed to start secondary namenode", e); terminate(1); } - - if (opts != null && opts.getCommand() != null) { - int ret = secondary.processStartupCommand(opts); - terminate(ret); - } - - if (secondary != null) { - secondary.startCheckpointThread(); - secondary.join(); - } } - - + public void startCheckpointThread() { Preconditions.checkState(checkpointThread == null, "Should not already have a thread"); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartup.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartup.java index 08fde3e6ba1..4b2878e8940 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartup.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartup.java @@ -62,6 +62,8 @@ import org.apache.hadoop.io.MD5Hash; import org.apache.hadoop.test.GenericTestUtils; import org.apache.hadoop.test.PathUtils; +import org.apache.hadoop.util.ExitUtil.ExitException; +import org.apache.hadoop.util.ExitUtil; import org.apache.hadoop.util.StringUtils; import org.apache.log4j.Logger; import org.junit.After; @@ -103,6 +105,8 @@ private void writeFile(FileSystem fileSys, Path name, int repl) @Before public void setUp() throws Exception { + ExitUtil.disableSystemExit(); + ExitUtil.resetFirstExitException(); config = new HdfsConfiguration(); hdfsDir = new File(MiniDFSCluster.getBaseDirectory()); @@ -418,7 +422,19 @@ public void testSNNStartup() throws IOException{ cluster.shutdown(); } } - + + @Test(timeout = 30000) + public void testSNNStartupWithRuntimeException() throws Exception { + String[] argv = new String[] { "-checkpoint" }; + try { + SecondaryNameNode.main(argv); + fail("Failed to handle runtime exceptions during SNN startup!"); + } catch (ExitException ee) { + GenericTestUtils.assertExceptionContains("ExitException", ee); + assertTrue("Didn't termiated properly ", ExitUtil.terminateCalled()); + } + } + @Test public void testCompression() throws IOException { LOG.info("Test compressing image.");