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 sr...@apache.org on 2012/04/28 00:54:45 UTC

svn commit: r1331621 - in /hadoop/common/branches/branch-1-win: ./ src/core/org/apache/hadoop/util/ src/mapred/org/apache/hadoop/mapred/ src/test/org/apache/hadoop/mapred/

Author: sradia
Date: Fri Apr 27 22:54:44 2012
New Revision: 1331621

URL: http://svn.apache.org/viewvc?rev=1331621&view=rev
Log:
    MAPREDUCE-4201 - Getting PID not working on Windows. Termination of Task/TaskJVM's not working (Bikas Saha via Sanjay)

Modified:
    hadoop/common/branches/branch-1-win/CHANGES.txt
    hadoop/common/branches/branch-1-win/src/core/org/apache/hadoop/util/ProcessTree.java
    hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/Child.java
    hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/JvmManager.java
    hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/mapred/TestKillSubProcesses.java

Modified: hadoop/common/branches/branch-1-win/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1-win/CHANGES.txt?rev=1331621&r1=1331620&r2=1331621&view=diff
==============================================================================
--- hadoop/common/branches/branch-1-win/CHANGES.txt (original)
+++ hadoop/common/branches/branch-1-win/CHANGES.txt Fri Apr 27 22:54:44 2012
@@ -11,6 +11,8 @@ branch-hadoop-1-win - unreleased
 
     HADOOP-8234 - Enable user group mappings on Windows (Bikas Saha via Sanjay)
 
+    MAPREDUCE-4201 - Getting PID not working on Windows. Termination of Task/TaskJVM's not working (Bikas Saha via Sanjay)
+
 Release 1.1.0 - unreleased
 
   NEW FEATURES

Modified: hadoop/common/branches/branch-1-win/src/core/org/apache/hadoop/util/ProcessTree.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1-win/src/core/org/apache/hadoop/util/ProcessTree.java?rev=1331621&r1=1331620&r2=1331621&view=diff
==============================================================================
--- hadoop/common/branches/branch-1-win/src/core/org/apache/hadoop/util/ProcessTree.java (original)
+++ hadoop/common/branches/branch-1-win/src/core/org/apache/hadoop/util/ProcessTree.java Fri Apr 27 22:54:44 2012
@@ -107,7 +107,19 @@ public class ProcessTree {
     if(!ProcessTree.isAlive(pid)) {
       return;
     }
-    String[] args = { "kill", "-" + signal.getValue(), pid };
+    String[] args = null;
+    if(Shell.WINDOWS){
+      if (signal == Signal.KILL) {
+        String[] wargs = { "taskkill", "/F", "/PID", pid };
+        args = wargs;
+      } else {
+        String[] wargs = { "taskkill", "/PID", pid };
+        args = wargs;
+      }
+    } else {
+     String[] uargs = { "kill", "-" + signal.getValue(), pid };
+     args = uargs;
+    }
     ShellCommandExecutor shexec = new ShellCommandExecutor(args);
     try {
       shexec.execute();
@@ -157,19 +169,29 @@ public class ProcessTree {
    * @return true if process is alive.
    */
   public static boolean isAlive(String pid) {
-    ShellCommandExecutor shexec = null;
-    try {
-      String[] args = { "kill", "-0", pid };
-      shexec = new ShellCommandExecutor(args);
-      shexec.execute();
-    } catch (ExitCodeException ee) {
-      return false;
-    } catch (IOException ioe) {
-      LOG.warn("Error executing shell command "
-          + Arrays.toString(shexec.getExecString()) + ioe);
-      return false;
+    if (Shell.WINDOWS) {
+      try {
+        String result = Shell.execCommand("cmd", "/c", "tasklist /FI \"PID eq "+pid+" \" /NH");
+        return (result.contains(pid));
+      } catch (IOException ioe) {
+        LOG.warn("Error executing shell command", ioe);
+        return false;
+      }
+    } else {
+      ShellCommandExecutor shexec = null;
+      try {
+        String[] args = { "kill", "-0", pid };
+        shexec = new ShellCommandExecutor(args);
+        shexec.execute();
+      } catch (ExitCodeException ee) {
+        return false;
+      } catch (IOException ioe) {
+        LOG.warn("Error executing shell command "
+            + Arrays.toString(shexec.getExecString()) + ioe);
+        return false;
+      }
+      return (shexec.getExitCode() == 0 ? true : false);
     }
-    return (shexec.getExitCode() == 0 ? true : false);
   }
   
   /**

Modified: hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/Child.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/Child.java?rev=1331621&r1=1331620&r2=1331621&view=diff
==============================================================================
--- hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/Child.java (original)
+++ hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/Child.java Fri Apr 27 22:54:44 2012
@@ -47,6 +47,8 @@ import org.apache.hadoop.util.Shell;
 import org.apache.hadoop.util.StringUtils;
 import org.apache.log4j.LogManager;
 
+import java.lang.management.ManagementFactory;
+
 /** 
  * The main() for child processes. 
  */
@@ -85,7 +87,6 @@ class Child {
       throw new IOException("Environment variable " + 
                              TaskRunner.HADOOP_WORK_DIR + " is not set");
     }
-
     // file name is passed thru env
     String jobTokenFile = 
       System.getenv().get(UserGroupInformation.HADOOP_TOKEN_FILE_LOCATION);
@@ -163,6 +164,15 @@ class Child {
     if (!Shell.WINDOWS) {
       pid = System.getenv().get("JVM_PID");
     }
+    else {
+      final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
+      String[] parts = jvmName.split("@");
+      try {
+        pid = Long.toString(Long.parseLong(parts[0]));
+      } catch (NumberFormatException nfe) {
+        LOG.equals("Failed to get pid for jvmId:" + jvmId);
+      }
+    }
     JvmContext context = new JvmContext(jvmId, pid);
     int idleLoopCount = 0;
     Task task = null;

Modified: hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/JvmManager.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/JvmManager.java?rev=1331621&r1=1331620&r2=1331621&view=diff
==============================================================================
--- hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/JvmManager.java (original)
+++ hadoop/common/branches/branch-1-win/src/mapred/org/apache/hadoop/mapred/JvmManager.java Fri Apr 27 22:54:44 2012
@@ -506,8 +506,7 @@ class JvmManager {
         } finally { // handle the exit code
           // although the process has exited before we get here,
           // make sure the entire process group has also been killed.
-          if (!Shell.WINDOWS)
-            kill();
+          kill();
           updateOnJvmExit(jvmId, exitCode);
           LOG.info("JVM : " + jvmId + " exited with exit code " + exitCode
               + ". Number of tasks it ran: " + numTasksRan);

Modified: hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/mapred/TestKillSubProcesses.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/mapred/TestKillSubProcesses.java?rev=1331621&r1=1331620&r2=1331621&view=diff
==============================================================================
--- hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/mapred/TestKillSubProcesses.java (original)
+++ hadoop/common/branches/branch-1-win/src/test/org/apache/hadoop/mapred/TestKillSubProcesses.java Fri Apr 27 22:54:44 2012
@@ -301,11 +301,12 @@ public class TestKillSubProcesses extend
 
     return UtilsForTests.runJob(conf, inDir, outDir);
   }
-
+  
   public void testJobKillFailAndSucceed() throws IOException {
-    if (Shell.WINDOWS) {
-      System.out.println(
-             "setsid doesn't work on WINDOWS as expected. Not testing");
+    if (Shell.DISABLEWINDOWS_TEMPORARILY) {
+      System.out
+          .println("setsid doesn't work on WINDOWS as expected. Not testing."
+              + "There also seem to be issues related to file permissions");
       return;
     }