diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/NodeManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/NodeManager.java index 03e17c8..2938fd6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/NodeManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/NodeManager.java @@ -94,6 +94,7 @@ private AtomicBoolean isStopping = new AtomicBoolean(false); private boolean rmWorkPreservingRestartEnabled; + private boolean shouldExitOnShutdownEvent = true; public NodeManager() { super(NodeManager.class.getName()); @@ -344,7 +345,17 @@ protected void shutDown() { new Thread() { @Override public void run() { - NodeManager.this.stop(); + try { + NodeManager.this.stop(); + } catch (Throwable t) { + LOG.error("Error while shutting down NodeManager", t); + } finally { + if (shouldExitOnShutdownEvent + && !ShutdownHookManager.get().isShutdownInProgress()) { + LOG.info("Exiting, bbye.."); + System.exit(-1); + } + } } }.start(); } @@ -587,4 +598,10 @@ public static void main(String[] args) throws IOException { public NodeStatusUpdater getNodeStatusUpdater() { return nodeStatusUpdater; } + + @VisibleForTesting + @Private + protected void setexitOnShutdownEvent(boolean exitOnShutdownEvent) { + this.shouldExitOnShutdownEvent = exitOnShutdownEvent; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeStatusUpdater.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeStatusUpdater.java index fc404de..0bc2cd2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeStatusUpdater.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeStatusUpdater.java @@ -458,6 +458,7 @@ public MyNodeStatusUpdater3 getNodeStatusUpdater() { public MyNodeManager2 (CyclicBarrier syncBarrier, Configuration conf) { this.syncBarrier = syncBarrier; this.conf = conf; + setexitOnShutdownEvent(false); } @Override protected NodeStatusUpdater createNodeStatusUpdater(Context context, @@ -1092,7 +1093,7 @@ public void cleanUpApplicationsOnNMShutDown() { }; } }; - + nm.setexitOnShutdownEvent(false); YarnConfiguration conf = createNMConfig(); nm.init(conf); nm.start(); @@ -1181,6 +1182,7 @@ protected NodeStatusUpdater createUpdater(Context context, return nodeStatusUpdater; } }; + nm.setexitOnShutdownEvent(false); verifyNodeStartFailure( "Recieved SHUTDOWN signal from Resourcemanager, " + "Registration of NodeManager failed, " @@ -1311,6 +1313,7 @@ protected void serviceStart() { @Test public void testApplicationKeepAlive() throws Exception { MyNodeManager nm = new MyNodeManager(); + nm.setexitOnShutdownEvent(false); try { YarnConfiguration conf = createNMConfig(); conf.setBoolean(YarnConfiguration.LOG_AGGREGATION_ENABLED, true); @@ -1649,7 +1652,7 @@ private YarnConfiguration createNMConfig() { } private NodeManager getNodeManager(final NodeAction nodeHeartBeatAction) { - return new NodeManager() { + NodeManager nm = new NodeManager() { @Override protected NodeStatusUpdater createNodeStatusUpdater(Context context, Dispatcher dispatcher, NodeHealthCheckerService healthChecker) { @@ -1661,5 +1664,7 @@ protected NodeStatusUpdater createNodeStatusUpdater(Context context, return myNodeStatusUpdater; } }; + nm.setexitOnShutdownEvent(false); + return nm; } }