diff --git 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 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 9c43ddef92a..aa2877db419 100644 --- 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 +++ 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 @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; @@ -99,7 +100,14 @@ protected void serviceStop() throws Exception { sched.shutdown(); boolean isShutdown = false; try { - isShutdown = sched.awaitTermination(10, TimeUnit.SECONDS); + long min = Long.MAX_VALUE; + for(Runnable runnable : sched.getQueue()) { + ScheduledFuture scheduledFuture = (ScheduledFuture)runnable; + long delay = scheduledFuture.getDelay(TimeUnit.MILLISECONDS); + if (delay < 10000) { + isShutdown = sched.awaitTermination(10, TimeUnit.SECONDS); + } + } } catch (InterruptedException e) { sched.shutdownNow(); isShutdown = true; diff --git 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 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 c6fa16df100..0198889eb35 100644 --- 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 +++ 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 @@ -175,6 +175,45 @@ public void testLogDeletion() throws IOException { } } + @Test + public void testEarlyShutdownDelayedDelete() throws IOException { + File[] localLogDirs = getLocalLogDirFiles(this.getClass().getName(), 2); + String localLogDirsString = + localLogDirs[0].getAbsolutePath() + "," + + localLogDirs[1].getAbsolutePath(); + + conf.set(YarnConfiguration.NM_LOG_DIRS, localLogDirsString); + conf.setBoolean(YarnConfiguration.LOG_AGGREGATION_ENABLED, false); + + conf.setLong(YarnConfiguration.NM_LOG_RETAIN_SECONDS, + YarnConfiguration.DEFAULT_NM_LOG_RETAIN_SECONDS); + + dirsHandler.init(conf); + + NonAggregatingLogHandler logHandler = + new NonAggregatingLogHandler(dispatcher, mockDelService, + dirsHandler, new NMNullStateStoreService()); + logHandler.init(conf); + logHandler.start(); + + logHandler.handle(new LogHandlerAppStartedEvent(appId, user, null, null)); + + logHandler.handle(new LogHandlerContainerFinishedEvent(container11, + ContainerType.APPLICATION_MASTER, 0)); + + logHandler.handle(new LogHandlerAppFinishedEvent(appId)); + + Path[] localAppLogDirs = new Path[2]; + localAppLogDirs[0] = + new Path(localLogDirs[0].getAbsolutePath(), appId.toString()); + localAppLogDirs[1] = + new Path(localLogDirs[1].getAbsolutePath(), appId.toString()); + + logHandler.close(); + for (int i = 0; i < localLogDirs.length; i++) { + FileUtils.deleteDirectory(localLogDirs[i]); + } + } @Test public void testDelayedDelete() throws IOException { File[] localLogDirs = getLocalLogDirFiles(this.getClass().getName(), 2);