Selaa lähdekoodia

commit 225283ea86afdc51079fd7066f48ff8da1125524
Author: Arun C Murthy <acmurthy@apache.org>
Date: Tue Jul 20 23:58:16 2010 -0700

HADOOP-5981. Fix variable substitution during parsing of child environment variables. Contributed by Krishna Ramachandran.

+++ b/YAHOO-CHANGES.txt
+ HADOOP-5981. Fix variable substitution during parsing of child environment
+ variables. (Krishna Ramachandran via acmurthy)
+


git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-patches@1077576 13f79535-47bb-0310-9956-ffa450edef68

Owen O'Malley 14 vuotta sitten
vanhempi
commit
b88fa64127

+ 14 - 5
src/mapred/org/apache/hadoop/mapred/TaskRunner.java

@@ -562,7 +562,8 @@ abstract class TaskRunner extends Thread {
     hadoopClientOpts = hadoopClientOpts + "-Dhadoop.tasklog.taskid=" + taskid
                        + " -Dhadoop.tasklog.iscleanup=" + t.isTaskCleanupTask()
                        + " -Dhadoop.tasklog.totalLogFileSize=" + logSize;
-    env.put("HADOOP_CLIENT_OPTS", "\"" + hadoopClientOpts + "\"");
+    // following line is a backport from jira MAPREDUCE-1286 
+    env.put("HADOOP_CLIENT_OPTS", hadoopClientOpts);
 
     // add the env variables passed by the user
     String mapredChildEnv = getChildEnv(conf);
@@ -588,7 +589,7 @@ abstract class TaskRunner extends Thread {
    * @return
    * @throws Throwable
    */
-  private String setEnvFromInputString(String errorInfo, Map<String, String> env,
+  String setEnvFromInputString(String errorInfo, Map<String, String> env,
       String mapredChildEnv) throws Throwable {
     if (mapredChildEnv != null && mapredChildEnv.length() > 0) {
       String childEnvs[] = mapredChildEnv.split(",");
@@ -596,6 +597,7 @@ abstract class TaskRunner extends Thread {
         try {
           String[] parts = cEnv.split("="); // split on '='
           String value = env.get(parts[0]);
+          
           if (value != null) {
             // replace $env with the child's env constructed by tt's
             // example LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp
@@ -609,9 +611,16 @@ abstract class TaskRunner extends Thread {
               // the env key is present in the tt's env
               value = parts[1].replace("$" + parts[0], value);
             } else {
-              // the env key is note present anywhere .. simply set it
-              // example X=$X:/tmp or X=/tmp
-              value = parts[1].replace("$" + parts[0], "");
+              // check for simple variable substitution
+              // for e.g. ROOT=$HOME
+              String envValue = System.getenv(parts[1].substring(1)); 
+              if (envValue != null) {
+                value = envValue;
+              } else {
+                // the env key is note present anywhere .. simply set it
+                // example X=$X:/tmp or X=/tmp
+                value = parts[1].replace("$" + parts[0], "");
+              }
             }
           }
           env.put(parts[0], value);

+ 6 - 0
src/test/org/apache/hadoop/mapred/TestTaskEnvironment.java

@@ -90,6 +90,7 @@ public class TestTaskEnvironment {
   public void testTaskEnv() throws Throwable {
     ttConf.set("mapreduce.admin.user.shell", "/bin/testshell");
     ttConf.set("mapreduce.admin.user.env", "key1=value1,key2=value2");
+    ttConf.set("mapred.child.env", "ROOT=$HOME");
     final Map<String, String> env = new HashMap<String, String>();
     String user = "test";
     JobConf taskConf = new JobConf(ttConf);
@@ -99,7 +100,9 @@ public class TestTaskEnvironment {
     TaskInProgress tip = tt.new TaskInProgress(task, taskConf);
     final TaskRunner taskRunner = task.createRunner(tt, tip);
     String errorInfo = "Child error";
+    String mapredChildEnv = taskRunner.getChildEnv(taskConf);
     taskRunner.updateUserLoginEnv(errorInfo, user, taskConf, env);
+    taskRunner.setEnvFromInputString(errorInfo, env, mapredChildEnv);
 
     final Vector<String> vargs = new Vector<String>(1);
     File pidFile = new File(TEST_DIR, "pid");
@@ -120,5 +123,8 @@ public class TestTaskEnvironment {
     assertTrue(jvmenvmap.containsValue("value2"));
     assertTrue(javaOpts, javaOpts.contains("Xmx"));
     assertTrue(javaOpts, javaOpts.contains("IPv4"));
+    
+    String root = jvmenvmap.get("ROOT");
+    assertTrue(root, root.contentEquals(System.getenv("HOME")));
   }
 }