diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java index 162823c..764d7b0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/ContainerManagerImpl.java @@ -116,6 +116,7 @@ import org.apache.hadoop.yarn.server.nodemanager.containermanager.application.ApplicationFinishEvent; import org.apache.hadoop.yarn.server.nodemanager.containermanager.application.ApplicationImpl; import org.apache.hadoop.yarn.server.nodemanager.containermanager.application.ApplicationInitEvent; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.application.ApplicationState; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerEvent; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerEventType; @@ -580,9 +581,15 @@ public void cleanUpApplicationsOnNMShutDown() { LOG.info("Waiting for Applications to be Finished"); + boolean logAggregationEnabled = getConfig().getBoolean( + YarnConfiguration.LOG_AGGREGATION_ENABLED, + YarnConfiguration.DEFAULT_LOG_AGGREGATION_ENABLED); long waitStartTime = System.currentTimeMillis(); while (!applications.isEmpty() && System.currentTimeMillis() - waitStartTime < waitForContainersOnShutdownMillis) { + if (!logAggregationEnabled && checkAppsAllFininshed(applications)) { + break; + } try { Thread.sleep(1000); } catch (InterruptedException ex) { @@ -600,6 +607,17 @@ public void cleanUpApplicationsOnNMShutDown() { } } + private boolean checkAppsAllFininshed(Map apps) { + for (ApplicationId applicationId : apps.keySet()) { + Application application = apps.get(applicationId); + if (application != null && + application.getApplicationState() != ApplicationState.FINISHED) { + return false; + } + } + return true; + } + public void cleanupContainersOnNMResync() { Map containers = context.getContainers(); if (containers.isEmpty()) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/NonAggregatingLogHandler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/NonAggregatingLogHandler.java index d42a4e7..43affc4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/NonAggregatingLogHandler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/NonAggregatingLogHandler.java @@ -95,17 +95,7 @@ protected void serviceInit(Configuration conf) throws Exception { @Override protected void serviceStop() throws Exception { if (sched != null) { - sched.shutdown(); - boolean isShutdown = false; - try { - isShutdown = sched.awaitTermination(10, TimeUnit.SECONDS); - } catch (InterruptedException e) { - sched.shutdownNow(); - isShutdown = true; - } - if (!isShutdown) { - sched.shutdownNow(); - } + sched.shutdownNow(); } super.serviceStop(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java index 980c764..9dbbbb6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerShutdown.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; +import org.apache.hadoop.util.Time; import org.junit.Assert; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileContext; @@ -138,6 +139,27 @@ public void testStateStoreRemovalOnDecommission() throws IOException { Assert.assertFalse(recoveryDir.exists()); } + @Test(timeout = 30000) + public void testNMShutdownQuickly() throws IOException, + YarnException { + nm = new TestNodeManager(); + int port = ServerSocketUtil.getPort(49157, 10); + Configuration configuration = createNMConfig(port); + configuration.setBoolean( + YarnConfiguration.LOG_AGGREGATION_ENABLED, false); + configuration.setLong(YarnConfiguration.NM_LOG_RETAIN_SECONDS, 30); + nm.init(configuration); + nm.start(); + startContainer(nm, cId, localFS, tmpDir, processStartFile, port); + + long start = Time.monotonicNow(); + nm.stop(); + long end = Time.monotonicNow(); + long timeUsed = end - start; + Assert.assertTrue("nodemanager shutdown use too much time: " + + timeUsed + " ms", timeUsed < 5*1000); + } + @Test public void testKillContainersOnShutdown() throws IOException, YarnException { 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 8c235eb..7ede8ec 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 @@ -567,10 +567,26 @@ protected void serviceStop() throws Exception { getNMContext().getApplications(); // ensure that applications are empty if(!applications.isEmpty()) { - assertionFailedInThread.set(true); + boolean logAggregationEnable = conf.getBoolean( + YarnConfiguration.LOG_AGGREGATION_ENABLED, + YarnConfiguration.DEFAULT_LOG_AGGREGATION_ENABLED); + if (logAggregationEnable || !checkAppsAllFininshed(applications)) { + assertionFailedInThread.set(true); + } } syncBarrier.await(10000, TimeUnit.MILLISECONDS); } + + private boolean checkAppsAllFininshed(Map apps) { + for (ApplicationId applicationId : apps.keySet()) { + Application application = apps.get(applicationId); + if (application != null && + application.getApplicationState() != ApplicationState.FINISHED) { + return false; + } + } + return true; + } } // private class MyResourceTracker2 implements ResourceTracker { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/TestNonAggregatingLogHandler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/TestNonAggregatingLogHandler.java index 46d06da..a2d8e9b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/TestNonAggregatingLogHandler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/loghandler/TestNonAggregatingLogHandler.java @@ -223,9 +223,6 @@ public void testStop() throws Exception { new NonAggregatingLogHandlerWithMockExecutor(null, null, null); logHandler.init(new Configuration()); logHandler.stop(); - verify(logHandler.mockSched).shutdown(); - verify(logHandler.mockSched) - .awaitTermination(eq(10l), eq(TimeUnit.SECONDS)); verify(logHandler.mockSched).shutdownNow(); logHandler.close(); aggregatingLogHandler.close();