diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java index 35630e6..9f78947 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerLaunch.java @@ -26,8 +26,10 @@ import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -79,6 +81,7 @@ public void setup() throws IOException { YarnConfiguration.NM_CONTAINER_MON_RESOURCE_CALCULATOR, LinuxResourceCalculatorPlugin.class, ResourceCalculatorPlugin.class); conf.setLong(YarnConfiguration.NM_SLEEP_DELAY_BEFORE_SIGKILL_MS, 1000); + conf.set(YarnConfiguration.NM_ADMIN_USER_ENV, "MALLOC_ARENA_MAX=4"); super.setup(); } @@ -149,6 +152,24 @@ public void testSpecialCharSymlinks() throws IOException { } } + // this is a dirty hack - but should be ok for a unittest. + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void setNewEnvironmentHack(Map newenv) + throws Exception { + Class[] classes = Collections.class.getDeclaredClasses(); + Map env = System.getenv(); + for (Class cl : classes) { + if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { + Field field = cl.getDeclaredField("m"); + field.setAccessible(true); + Object obj = field.get(env); + Map map = (Map) obj; + map.clear(); + map.putAll(newenv); + } + } + } + /** * See if environment variable is forwarded using sanitizeEnv. * @throws Exception @@ -175,6 +196,11 @@ public void testContainerEnvVariables() throws Exception { userSetEnv.put(Environment.LOCAL_DIRS.name(), "user_set_LOCAL_DIR"); containerLaunchContext.setEnvironment(userSetEnv); + Map envWithDummy = new HashMap(); + envWithDummy.putAll(System.getenv()); + envWithDummy.put(Environment.MALLOC_ARENA_MAX.name(), "1"); + setNewEnvironmentHack(envWithDummy); + File scriptFile = Shell.appendScriptExtension(tmpDir, "scriptFile"); PrintWriter fileWriter = new PrintWriter(scriptFile); File processStartFile = @@ -190,6 +216,8 @@ public void testContainerEnvVariables() throws Exception { + processStartFile); fileWriter.println("@echo " + Environment.LOCAL_DIRS.$() + ">> " + processStartFile); + fileWriter.println("@echo " + Environment.MALLOC_ARENA_MAX.$() + ">> " + + processStartFile); fileWriter.println("@ping -n 100 127.0.0.1 >nul"); } else { fileWriter.write("\numask 0"); // So that start file is readable by the test @@ -203,6 +231,8 @@ public void testContainerEnvVariables() throws Exception { + processStartFile); fileWriter.write("\necho $" + Environment.LOCAL_DIRS.name() + " >> " + processStartFile); + fileWriter.write("\necho $" + Environment.MALLOC_ARENA_MAX.name() + + " >> " + processStartFile); fileWriter.write("\necho $$ >> " + processStartFile); fileWriter.write("\nexec sleep 100"); } @@ -263,6 +293,7 @@ public void testContainerEnvVariables() throws Exception { reader.readLine()); Assert.assertEquals(String.valueOf(HTTP_PORT), reader.readLine()); Assert.assertEquals(StringUtils.join(",", appDirs), reader.readLine()); + Assert.assertEquals("4", reader.readLine()); Assert.assertEquals(cId.toString(), containerLaunchContext .getEnvironment().get(Environment.CONTAINER_ID.name())); @@ -274,6 +305,8 @@ public void testContainerEnvVariables() throws Exception { .getEnvironment().get(Environment.NM_HTTP_PORT.name())); Assert.assertEquals(StringUtils.join(",", appDirs), containerLaunchContext .getEnvironment().get(Environment.LOCAL_DIRS.name())); + Assert.assertEquals("4", containerLaunchContext + .getEnvironment().get(Environment.MALLOC_ARENA_MAX.name())); // Get the pid of the process String pid = reader.readLine().trim(); // No more lines