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/linux/resources/CGroupsHandlerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsHandlerImpl.java index 6a87ede0512..e022ffed38c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsHandlerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsHandlerImpl.java @@ -175,9 +175,8 @@ private void initializeControllerPaths() throws ResourceHandlerException { } @VisibleForTesting - static Map initializeControllerPathsFromMtab( - Map> parsedMtab) - throws ResourceHandlerException { + Map initializeControllerPathsFromMtab( + Map> parsedMtab) { Map ret = new HashMap<>(); for (CGroupController controller : CGroupController.values()) { @@ -257,23 +256,28 @@ private void initializeControllerPaths() throws ResourceHandlerException { * same hierarchy. * @param controller subsystem like cpu, cpuset, etc... * @param entries map of paths to mount options - * @return the first mount path that has the requested subsystem + * @return the mount path that has the requested subsystem */ @VisibleForTesting - static String findControllerInMtab(String controller, + String findControllerInMtab(String controller, Map> entries) { + String controllerPath = null; for (Map.Entry> e : entries.entrySet()) { if (e.getValue().contains(controller)) { if (new File(e.getKey()).canRead()) { - return e.getKey(); + controllerPath = e.getKey(); } else { LOG.warn(String.format( "Skipping inaccessible cgroup mount point %s", e.getKey())); } } + if(null != controllerPath && controllerPath. + contains(getCGroupMountPath())){ + return controllerPath; + } } - return null; + return controllerPath; } private void mountCGroupController(CGroupController controller) 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/linux/resources/TestCGroupsHandlerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsHandlerImpl.java index b1e8989213b..296da0bc67d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsHandlerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsHandlerImpl.java @@ -359,6 +359,9 @@ public void testCGroupOperations() throws IOException { */ @Test public void testMtabParsing() throws Exception { + CGroupsHandlerImpl handler = new CGroupsHandlerImpl( + createNoMountConfiguration(tmpPath), + privilegedOperationExecutorMock); // Initialize mtab and cgroup dir File parentDir = new File(tmpPath); // create mock cgroup @@ -368,7 +371,7 @@ public void testMtabParsing() throws Exception { Map> newMtab = CGroupsHandlerImpl.parseMtab(mockMtabFile.getAbsolutePath()); Map controllerPaths = - CGroupsHandlerImpl.initializeControllerPathsFromMtab( + handler.initializeControllerPathsFromMtab( newMtab); // Verify @@ -516,6 +519,35 @@ public void testSelectCgroup() throws Exception { } } + @Test + public void testSelectCgroupFromMultiSameController() throws Exception{ + File mountPath = new File(tmpPath, "cpu"); + String dataPath = System.getProperty("test.build.data"); + File test1Path = new File( dataPath + "/test1", "cpu"); + File test2Path = new File( dataPath + "/test2", "cpu"); + try { + File emptyMtab = createEmptyCgroups(); + CGroupsHandlerImpl cGroupsHandler = new CGroupsHandlerImpl( + createMountConfiguration(), + privilegedOperationExecutorMock, emptyMtab.getAbsolutePath()); + Map> cgroups = new LinkedHashMap<>(); + + Assert.assertTrue("temp dir should be created", mountPath.mkdirs()); + Assert.assertTrue("temp dir should be created", test1Path.mkdirs()); + Assert.assertTrue("temp dir should be created", test2Path.exists()); + + cgroups.put(test1Path.getAbsolutePath(),Collections.singleton("cpu")); + cgroups.put(mountPath.getAbsolutePath(),Collections.singleton("cpu")); + cgroups.put(test2Path.getAbsolutePath(),Collections.singleton("cpu")); + String selectedCPU = cGroupsHandler.findControllerInMtab("cpu", cgroups); + Assert.assertEquals("Wrong CPU mount point selected", + mountPath.getAbsolutePath(), selectedCPU); + } finally { + FileUtils.deleteQuietly(mountPath); + FileUtils.deleteQuietly(test1Path); + FileUtils.deleteQuietly(test2Path); + } + } /** * Tests whether mtab parsing works as expected with an empty hierarchy set. * @throws Exception the test will fail