diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DeletionService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DeletionService.java index 45504fd..4b0bd36 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DeletionService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/DeletionService.java @@ -51,6 +51,8 @@ private ScheduledThreadPoolExecutor sched; private static final FileContext lfs = getLfs(); + private volatile boolean stopping = false; + static final FileContext getLfs() { try { return FileContext.getLocalFSFileContext(); @@ -74,6 +76,13 @@ public DeletionService(ContainerExecutor exec) { * @param baseDirs the base directories which contains the subDir's */ public void delete(String user, Path subDir, Path... baseDirs) { + if (stopping) { + LOG.warn(DeletionService.class.getSimpleName() + + " is stopping. Dropping new request to delete " + subDir + + " under " + baseDirs); + return; + } + // TODO if parent owned by NM, rename within parent inline if (debugDelay != -1) { if (baseDirs == null || baseDirs.length == 0) { @@ -88,6 +97,12 @@ public void delete(String user, Path subDir, Path... baseDirs) { } public void scheduleFileDeletionTask(FileDeletionTask fileDeletionTask) { + if (stopping) { + LOG.warn(DeletionService.class.getSimpleName() + + " is stopping. Dropping new request to delete " + fileDeletionTask); + return; + } + if (debugDelay != -1) { sched.schedule(fileDeletionTask, debugDelay, TimeUnit.SECONDS); } @@ -114,8 +129,11 @@ protected void serviceInit(Configuration conf) throws Exception { @Override protected void serviceStop() throws Exception { + // DeletionService is getting terminated. Set the stop flag and stop + // accepting new requests. + stopping = true; if (sched != null) { - sched.shutdown(); + // Wait a while to let existing tasks to finish boolean terminated = false; try { terminated = sched.awaitTermination(10, SECONDS); 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/logaggregation/TestLogAggregationService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/TestLogAggregationService.java index bfb0e87..417ef1a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/TestLogAggregationService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/logaggregation/TestLogAggregationService.java @@ -106,9 +106,6 @@ import org.mockito.Mockito; import org.mortbay.util.MultiException; - - -//@Ignore public class TestLogAggregationService extends BaseContainerManagerTest { private Map acls = createAppAcls();