You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by jl...@apache.org on 2014/10/30 16:11:25 UTC

git commit: YARN-2755. NM fails to clean up usercache_DEL_ dirs after YARN-661. Contributed by Siqi Li

Repository: hadoop
Updated Branches:
  refs/heads/trunk 179cab81e -> 73e626ad9


YARN-2755. NM fails to clean up usercache_DEL_<timestamp> dirs after YARN-661. Contributed by Siqi Li


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/73e626ad
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/73e626ad
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/73e626ad

Branch: refs/heads/trunk
Commit: 73e626ad91cd5c06a005068d8432fd16e06fe6a0
Parents: 179cab8
Author: Jason Lowe <jl...@apache.org>
Authored: Thu Oct 30 15:10:27 2014 +0000
Committer: Jason Lowe <jl...@apache.org>
Committed: Thu Oct 30 15:10:27 2014 +0000

----------------------------------------------------------------------
 hadoop-yarn-project/CHANGES.txt                 |  3 +
 .../localizer/ResourceLocalizationService.java  |  2 +-
 .../nodemanager/TestNodeManagerReboot.java      | 66 +++++++++++++++-----
 3 files changed, 54 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/73e626ad/hadoop-yarn-project/CHANGES.txt
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt
index f4e4afa..0e06661 100644
--- a/hadoop-yarn-project/CHANGES.txt
+++ b/hadoop-yarn-project/CHANGES.txt
@@ -801,6 +801,9 @@ Release 2.6.0 - UNRELEASED
     YARN-2769. Fixed the problem that timeline domain is not set in distributed shell
     AM when using shell_command on Windows. (Varun Vasudev via zjshen)
 
+    YARN-2755. NM fails to clean up usercache_DEL_<timestamp> dirs after
+    YARN-661 (Siqi Li via jlowe)
+
 Release 2.5.1 - 2014-09-05
 
   INCOMPATIBLE CHANGES

http://git-wip-us.apache.org/repos/asf/hadoop/blob/73e626ad/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java
----------------------------------------------------------------------
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/localizer/ResourceLocalizationService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java
index 549d8e7..08ed3a1 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/localizer/ResourceLocalizationService.java
@@ -1324,7 +1324,7 @@ public class ResourceLocalizationService extends CompositeService
     RemoteIterator<FileStatus> userDirStatus = lfs.listStatus(userDirPath);
     FileDeletionTask dependentDeletionTask =
         del.createFileDeletionTask(null, userDirPath, new Path[] {});
-    if (userDirStatus != null) {
+    if (userDirStatus != null && userDirStatus.hasNext()) {
       List<FileDeletionTask> deletionTasks = new ArrayList<FileDeletionTask>();
       while (userDirStatus.hasNext()) {
         FileStatus status = userDirStatus.next();

http://git-wip-us.apache.org/repos/asf/hadoop/blob/73e626ad/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerReboot.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerReboot.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerReboot.java
index e69170e..e9aea0e 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerReboot.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/TestNodeManagerReboot.java
@@ -35,7 +35,9 @@ import java.util.Map;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.FileContext;
+import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.fs.RemoteIterator;
 import org.apache.hadoop.fs.UnsupportedFileSystemException;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.yarn.api.ContainerManagementProtocol;
@@ -190,17 +192,41 @@ public class TestNodeManagerReboot {
         ResourceLocalizationService.NM_PRIVATE_DIR) > 0);
 
     // restart the NodeManager
+    restartNM(MAX_TRIES);
+    checkNumOfLocalDirs();
+    
+    verify(delService, times(1)).delete(
+      (String) isNull(),
+      argThat(new PathInclude(ResourceLocalizationService.NM_PRIVATE_DIR
+          + "_DEL_")));
+    verify(delService, times(1)).delete((String) isNull(),
+      argThat(new PathInclude(ContainerLocalizer.FILECACHE + "_DEL_")));
+    verify(delService, times(1)).scheduleFileDeletionTask(
+      argThat(new FileDeletionInclude(user, null,
+        new String[] { destinationFile })));
+    verify(delService, times(1)).scheduleFileDeletionTask(
+      argThat(new FileDeletionInclude(null, ContainerLocalizer.USERCACHE
+          + "_DEL_", new String[] {})));
+    
+    // restart the NodeManager again
+    // this time usercache directory should be empty
+    restartNM(MAX_TRIES);
+    checkNumOfLocalDirs();
+    
+  }
+
+  private void restartNM(int maxTries) {
     nm.stop();
     nm = new MyNodeManager();
     nm.start();
 
-    numTries = 0;
+    int numTries = 0;
     while ((numOfLocalDirs(nmLocalDir.getAbsolutePath(),
       ContainerLocalizer.USERCACHE) > 0
         || numOfLocalDirs(nmLocalDir.getAbsolutePath(),
           ContainerLocalizer.FILECACHE) > 0 || numOfLocalDirs(
       nmLocalDir.getAbsolutePath(), ResourceLocalizationService.NM_PRIVATE_DIR) > 0)
-        && numTries < MAX_TRIES) {
+        && numTries < maxTries) {
       try {
         Thread.sleep(500);
       } catch (InterruptedException ex) {
@@ -208,7 +234,9 @@ public class TestNodeManagerReboot {
       }
       numTries++;
     }
-
+  }
+  
+  private void checkNumOfLocalDirs() throws IOException {
     Assert
       .assertTrue(
         "After NM reboots, all local files should be deleted",
@@ -218,20 +246,13 @@ public class TestNodeManagerReboot {
               ContainerLocalizer.FILECACHE) == 0
             && numOfLocalDirs(nmLocalDir.getAbsolutePath(),
               ResourceLocalizationService.NM_PRIVATE_DIR) == 0);
-    verify(delService, times(1)).delete(
-      (String) isNull(),
-      argThat(new PathInclude(ResourceLocalizationService.NM_PRIVATE_DIR
-          + "_DEL_")));
-    verify(delService, times(1)).delete((String) isNull(),
-      argThat(new PathInclude(ContainerLocalizer.FILECACHE + "_DEL_")));
-    verify(delService, times(1)).scheduleFileDeletionTask(
-      argThat(new FileDeletionInclude(user, null,
-        new String[] { destinationFile })));
-    verify(delService, times(1)).scheduleFileDeletionTask(
-      argThat(new FileDeletionInclude(null, ContainerLocalizer.USERCACHE
-          + "_DEL_", new String[] {})));
+    
+    Assert
+    .assertTrue(
+      "After NM reboots, usercache_DEL_* directory should be deleted",
+      numOfUsercacheDELDirs(nmLocalDir.getAbsolutePath()) == 0);
   }
-
+  
   private int numOfLocalDirs(String localDir, String localSubDir) {
     File[] listOfFiles = new File(localDir, localSubDir).listFiles();
     if (listOfFiles == null) {
@@ -240,6 +261,19 @@ public class TestNodeManagerReboot {
       return listOfFiles.length;
     }
   }
+  
+  private int numOfUsercacheDELDirs(String localDir) throws IOException {
+    int count = 0;
+    RemoteIterator<FileStatus> fileStatus = localFS.listStatus(new Path(localDir));
+    while (fileStatus.hasNext()) {
+      FileStatus status = fileStatus.next();
+      if (status.getPath().getName().matches(".*" +
+          ContainerLocalizer.USERCACHE + "_DEL_.*")) {
+        count++;
+      }
+    }
+    return count;
+  }
 
   private void createFiles(String dir, String subDir, int numOfFiles) {
     for (int i = 0; i < numOfFiles; i++) {