From 93972a332a9fc6390447fc5fc9785c98fb4c3344 Mon Sep 17 00:00:00 2001 From: Vinayakumar B Date: Tue, 19 May 2015 12:24:25 +0530 Subject: [PATCH] HDFS-6348. SecondaryNameNode not terminating properly on runtime exceptions (Contributed by Rakesh R) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 5 ++- .../server/namenode/SecondaryNameNode.java | 35 +++++++++---------- .../hdfs/server/namenode/TestStartup.java | 18 +++++++++- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 35c3b5a785..e5fcba291f 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 Trunk (Unreleased) @@ -788,6 +788,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 b499e74dc2..0fa1cd5000 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); + + 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 01621ada93..4d3cb75e70 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 @@ -60,6 +60,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; @@ -87,6 +89,8 @@ public class TestStartup { @Before public void setUp() throws Exception { + ExitUtil.disableSystemExit(); + ExitUtil.resetFirstExitException(); config = new HdfsConfiguration(); hdfsDir = new File(MiniDFSCluster.getBaseDirectory()); @@ -403,7 +407,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.");