HDFS-6348. SecondaryNameNode not terminating properly on runtime exceptions (Contributed by Rakesh R)
(cherry picked from commit 93972a332a9fc6390447fc5fc9785c98fb4c3344) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/6dee42f6 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/6dee42f6 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/6dee42f6 Branch: refs/heads/branch-2 Commit: 6dee42f6dba12106b7218d068b8eaa5df8739b36 Parents: 5caea4c Author: Vinayakumar B <vinayakum...@apache.org> Authored: Tue May 19 12:24:25 2015 +0530 Committer: Vinayakumar B <vinayakum...@apache.org> Committed: Tue May 19 12:25:00 2015 +0530 ---------------------------------------------------------------------- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 5 ++- .../hdfs/server/namenode/SecondaryNameNode.java | 33 ++++++++++---------- .../hdfs/server/namenode/TestStartup.java | 18 ++++++++++- 3 files changed, 37 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/6dee42f6/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 36c3fe0..07bbd36 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 http://git-wip-us.apache.org/repos/asf/hadoop/blob/6dee42f6/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java ---------------------------------------------------------------------- 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 b499e74..0fa1cd5 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 class SecondaryNameNode implements Runnable, 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); - terminate(1); - } - if (opts != null && opts.getCommand() != null) { - int ret = secondary.processStartupCommand(opts); - terminate(ret); - } + if (opts != null && opts.getCommand() != null) { + int ret = secondary.processStartupCommand(opts); + terminate(ret); + } - if (secondary != null) { - secondary.startCheckpointThread(); - secondary.join(); + if (secondary != null) { + secondary.startCheckpointThread(); + secondary.join(); + } + } catch (Throwable e) { + LOG.fatal("Failed to start secondary namenode", e); + terminate(1); } } - - + public void startCheckpointThread() { Preconditions.checkState(checkpointThread == null, "Should not already have a thread"); http://git-wip-us.apache.org/repos/asf/hadoop/blob/6dee42f6/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartup.java ---------------------------------------------------------------------- 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 08fde3e..4b2878e 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.hdfs.util.MD5FileUtils; 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 @@ public class TestStartup { @Before public void setUp() throws Exception { + ExitUtil.disableSystemExit(); + ExitUtil.resetFirstExitException(); config = new HdfsConfiguration(); hdfsDir = new File(MiniDFSCluster.getBaseDirectory()); @@ -418,7 +422,19 @@ public class TestStartup { 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.");