diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index d96cfe9150..2a51065404 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -2733,6 +2733,10 @@ public static boolean isAclEnabled(Configuration conf) { public static final String NM_LINUX_CONTAINER_CGROUPS_MOUNT_PATH = NM_PREFIX + "linux-container-executor.cgroups.mount-path"; + /** Where the linux container executor should mount cgroups v2 if not found. */ + public static final String NM_LINUX_CONTAINER_CGROUPS_V2_MOUNT_PATH = + NM_PREFIX + "linux-container-executor.cgroups.v2.mount-path"; + /** * Whether the apps should run in strict resource usage mode(not allowed to * use spare CPU) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml index aac840866e..275fc08cb2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml @@ -2087,6 +2087,20 @@ yarn.nodemanager.linux-container-executor.cgroups.mount-path + + This property sets the mount path for CGroups v2. + This parameter is optional, and needed to be set only in mixed mode, + when CGroups v2 is mounted alongside with Cgroups v1. + For example, in hybrid mode, CGroups v1 controllers can be mounted under /sys/fs/cgroup/ + (for example /sys/fs/cgroup/cpu,cpuacct), while v2 can be mounted in /sys/fs/cgroup/unified folder. + + If this value is not set, the value of + yarn.nodemanager.linux-container-executor.cgroups.mount-path + will be used for CGroups v2 as well. + + yarn.nodemanager.linux-container-executor.cgroups.v2.mount-path + + Delay in ms between attempts to remove linux cgroup yarn.nodemanager.linux-container-executor.cgroups.delete-delay-ms 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/CGroupsMountConfig.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/CGroupsMountConfig.java index 6eb8667f2a..b5a71f6072 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/CGroupsMountConfig.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/CGroupsMountConfig.java @@ -26,11 +26,17 @@ public class CGroupsMountConfig { private final boolean enableMount; private final String mountPath; + // CGroups v2 mount path is only relevant in mixed CGroups v1/v2 mode, + // where v2 is mounted alongside with v1. + private final String v2MountPath; + public CGroupsMountConfig(Configuration conf) { this.enableMount = conf.getBoolean(YarnConfiguration. NM_LINUX_CONTAINER_CGROUPS_MOUNT, false); this.mountPath = conf.get(YarnConfiguration. NM_LINUX_CONTAINER_CGROUPS_MOUNT_PATH, null); + this.v2MountPath = conf.get(YarnConfiguration. + NM_LINUX_CONTAINER_CGROUPS_V2_MOUNT_PATH, mountPath); } public boolean ensureMountPathIsDefined() throws ResourceHandlerException { @@ -62,11 +68,16 @@ public String getMountPath() { return mountPath; } + public String getV2MountPath() { + return v2MountPath; + } + @Override public String toString() { return "CGroupsMountConfig{" + "enableMount=" + enableMount + - ", mountPath='" + mountPath + '\'' + + ", mountPath='" + mountPath + + ", v2MountPath='" + v2MountPath + '\'' + '}'; } } 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/CGroupsV2HandlerImpl.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/CGroupsV2HandlerImpl.java index cd362ab9a5..356a4c42df 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/CGroupsV2HandlerImpl.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/CGroupsV2HandlerImpl.java @@ -97,8 +97,8 @@ protected List getCGroupControllers() { @Override protected Map> parsePreConfiguredMountPath() throws IOException { Map> controllerMappings = new HashMap<>(); - controllerMappings.put(this.cGroupsMountConfig.getMountPath(), - readControllersFile(this.cGroupsMountConfig.getMountPath())); + controllerMappings.put(this.cGroupsMountConfig.getV2MountPath(), + readControllersFile(this.cGroupsMountConfig.getV2MountPath())); return controllerMappings; } 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/ResourceHandlerModule.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/ResourceHandlerModule.java index 118013f55a..98492779b0 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/ResourceHandlerModule.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/ResourceHandlerModule.java @@ -63,11 +63,12 @@ public class ResourceHandlerModule { * as resource metrics functionality. We need to ensure that the same * instance is used for both. */ + private static volatile CGroupsHandler cGroupV1Handler; + private static volatile CGroupsHandler cGroupV2Handler; private static volatile TrafficControlBandwidthHandlerImpl trafficControlBandwidthHandler; private static volatile NetworkPacketTaggingHandlerImpl networkPacketTaggingHandlerImpl; - private static volatile CGroupsHandler cGroupsHandler; private static volatile CGroupsBlkioResourceHandlerImpl cGroupsBlkioResourceHandler; private static volatile MemoryResourceHandler @@ -75,23 +76,42 @@ public class ResourceHandlerModule { private static volatile CpuResourceHandler cGroupsCpuResourceHandler; - /** - * Returns an initialized, thread-safe CGroupsHandler instance. - */ - private static CGroupsHandler getInitializedCGroupsHandler(Configuration conf) + private static void initializeCGroupHandlers(Configuration conf) throws ResourceHandlerException { - if (cGroupsHandler == null) { + initializeCGroupV1Handler(conf); + if (cgroupsV2Enabled) { + initializeCGroupV2Handler(conf); + } + } + + private static void initializeCGroupV1Handler(Configuration conf) + throws ResourceHandlerException { + if (cGroupV1Handler == null) { synchronized (CGroupsHandler.class) { - if (cGroupsHandler == null) { - cGroupsHandler = cgroupsV2Enabled - ? new CGroupsV2HandlerImpl(conf, PrivilegedOperationExecutor.getInstance(conf)) - : new CGroupsHandlerImpl(conf, PrivilegedOperationExecutor.getInstance(conf)); - LOG.debug("Value of CGroupsHandler is: {}", cGroupsHandler); + if (cGroupV1Handler == null) { + cGroupV1Handler = new CGroupsHandlerImpl( + conf, PrivilegedOperationExecutor.getInstance(conf)); + LOG.debug("Value of CGroupsV1Handler is: {}", cGroupV1Handler); } } } + } - return cGroupsHandler; + private static void initializeCGroupV2Handler(Configuration conf) + throws ResourceHandlerException { + if (cGroupV2Handler == null) { + synchronized (CGroupsHandler.class) { + if (cGroupV2Handler == null) { + cGroupV2Handler = new CGroupsV2HandlerImpl( + conf, PrivilegedOperationExecutor.getInstance(conf)); + LOG.debug("Value of CGroupsV2Handler is: {}", cGroupV2Handler); + } + } + } + } + + private static boolean isMountedInCGroupsV2(CGroupsHandler.CGroupController controller) { + return (cGroupV2Handler != null && cGroupV2Handler.getControllerPath(controller) != null); } /** @@ -101,7 +121,7 @@ private static CGroupsHandler getInitializedCGroupsHandler(Configuration conf) */ public static CGroupsHandler getCGroupsHandler() { - return cGroupsHandler; + return cGroupV1Handler; } /** @@ -109,10 +129,10 @@ public static CGroupsHandler getCGroupsHandler() { * not initialized, or if the path is empty. */ public static String getCgroupsRelativeRoot() { - if (cGroupsHandler == null) { + if (getCGroupsHandler() == null) { return null; } - String cGroupPath = cGroupsHandler.getRelativePathForCGroup(""); + String cGroupPath = getCGroupsHandler().getRelativePathForCGroup(""); if (cGroupPath == null || cGroupPath.isEmpty()) { return null; } @@ -153,9 +173,13 @@ private static CpuResourceHandler initCGroupsCpuResourceHandler( synchronized (CpuResourceHandler.class) { if (cGroupsCpuResourceHandler == null) { LOG.debug("Creating new cgroups cpu handler"); - cGroupsCpuResourceHandler = cgroupsV2Enabled - ? new CGroupsV2CpuResourceHandlerImpl(getInitializedCGroupsHandler(conf)) - : new CGroupsCpuResourceHandlerImpl(getInitializedCGroupsHandler(conf)); + + initializeCGroupHandlers(conf); + if (isMountedInCGroupsV2(CGroupsHandler.CGroupController.CPU)) { + cGroupsCpuResourceHandler = new CGroupsV2CpuResourceHandlerImpl(cGroupV2Handler); + } else { + cGroupsCpuResourceHandler = new CGroupsCpuResourceHandlerImpl(cGroupV1Handler); + } return cGroupsCpuResourceHandler; } } @@ -173,9 +197,11 @@ private static CpuResourceHandler initCGroupsCpuResourceHandler( synchronized (OutboundBandwidthResourceHandler.class) { if (trafficControlBandwidthHandler == null) { LOG.info("Creating new traffic control bandwidth handler."); + + initializeCGroupHandlers(conf); trafficControlBandwidthHandler = new TrafficControlBandwidthHandlerImpl(PrivilegedOperationExecutor - .getInstance(conf), getInitializedCGroupsHandler(conf), + .getInstance(conf), cGroupV1Handler, new TrafficController(conf, PrivilegedOperationExecutor .getInstance(conf))); } @@ -208,10 +234,11 @@ public static ResourceHandler getNetworkTaggingHandler(Configuration conf) synchronized (OutboundBandwidthResourceHandler.class) { if (networkPacketTaggingHandlerImpl == null) { LOG.info("Creating new network-tagging-handler."); + + initializeCGroupHandlers(conf); networkPacketTaggingHandlerImpl = new NetworkPacketTaggingHandlerImpl( - PrivilegedOperationExecutor.getInstance(conf), - getInitializedCGroupsHandler(conf)); + PrivilegedOperationExecutor.getInstance(conf), cGroupV1Handler); } } } @@ -239,9 +266,10 @@ private static CGroupsBlkioResourceHandlerImpl getCgroupsBlkioResourceHandler( synchronized (DiskResourceHandler.class) { if (cGroupsBlkioResourceHandler == null) { LOG.debug("Creating new cgroups blkio handler"); + + initializeCGroupHandlers(conf); cGroupsBlkioResourceHandler = - new CGroupsBlkioResourceHandlerImpl( - getInitializedCGroupsHandler(conf)); + new CGroupsBlkioResourceHandlerImpl(cGroupV1Handler); } } } @@ -263,9 +291,13 @@ public static MemoryResourceHandler initMemoryResourceHandler( if (cGroupsMemoryResourceHandler == null) { synchronized (MemoryResourceHandler.class) { if (cGroupsMemoryResourceHandler == null) { - cGroupsMemoryResourceHandler = cgroupsV2Enabled - ? new CGroupsV2MemoryResourceHandlerImpl(getInitializedCGroupsHandler(conf)) - : new CGroupsMemoryResourceHandlerImpl(getInitializedCGroupsHandler(conf)); + + initializeCGroupHandlers(conf); + if (isMountedInCGroupsV2(CGroupsHandler.CGroupController.MEMORY)) { + cGroupsMemoryResourceHandler = new CGroupsV2MemoryResourceHandlerImpl(cGroupV2Handler); + } else { + cGroupsMemoryResourceHandler = new CGroupsMemoryResourceHandlerImpl(cGroupV1Handler); + } } } } @@ -327,9 +359,10 @@ private static void addHandlersFromConfiguredResourcePlugins( } for (ResourcePlugin plugin : pluginMap.values()) { + initializeCGroupHandlers(conf); addHandlerIfNotNull(handlerList, plugin.createResourceHandler(nmContext, - getInitializedCGroupsHandler(conf), + cGroupV1Handler, PrivilegedOperationExecutor.getInstance(conf))); } } @@ -360,21 +393,6 @@ static void nullifyResourceHandlerChain() throws ResourceHandlerException { resourceHandlerChain = null; } - @VisibleForTesting - static void resetCgroupsHandler() { - cGroupsHandler = null; - } - - @VisibleForTesting - static void resetCpuResourceHandler() { - cGroupsCpuResourceHandler = null; - } - - @VisibleForTesting - static void resetMemoryResourceHandler() { - cGroupsMemoryResourceHandler = null; - } - /** * If a cgroup mount directory is specified, it returns cgroup directories * with valid names. 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/TestCGroupsV2HandlerImpl.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/TestCGroupsV2HandlerImpl.java index 1198cda7ab..1ec952be04 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/TestCGroupsV2HandlerImpl.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/TestCGroupsV2HandlerImpl.java @@ -210,6 +210,111 @@ public void testMtabParsing() throws Exception { Assert.assertEquals(parentDir.getAbsolutePath(), memoryDir); } + /* + * Create a mock mtab file with the following content for hybrid v1/v2: + * cgroup2 /path/to/parentV2Dir cgroup2 rw,nosuid,nodev,noexec,relatime,memory_recursiveprot 0 0 + * cgroup /path/to/parentDir/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0 + * + * Create the following cgroup hierarchy: + * + * parentDir + * __________________________________ + * / \ + * unified memory + * _________________________________________________ + * / \ \ + * cgroup.controllers cgroup.subtree_control test-hadoop-yarn (hierarchyDir) + * _________________ + * / \ + * cgroup.controllers cgroup.subtree_control + */ + public File createPremountedHybridCgroups(File v1ParentDir) + throws IOException { + File v2ParentDir = new File(v1ParentDir, "unified"); + + String mtabContent = + "cgroup " + v1ParentDir.getAbsolutePath() + "/memory" + + " cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0\n" + + "cgroup2 " + v2ParentDir.getAbsolutePath() + + " cgroup2 rw,nosuid,nodev,noexec,relatime,memory_recursiveprot 0 0\n"; + + File mockMtab = createFileWithContent(v1ParentDir, UUID.randomUUID().toString(), mtabContent); + + String enabledV2Controllers = "cpuset cpu io hugetlb pids rdma misc\n"; + File controllersFile = createFileWithContent(v2ParentDir, + CGroupsHandler.CGROUP_CONTROLLERS_FILE, enabledV2Controllers); + + File subtreeControlFile = new File(v2ParentDir, CGroupsHandler.CGROUP_SUBTREE_CONTROL_FILE); + Assert.assertTrue("empty subtree_control file should be created", + subtreeControlFile.createNewFile()); + + File hierarchyDir = new File(v2ParentDir, hierarchy); + if (!hierarchyDir.mkdirs()) { + String message = "Could not create directory " + hierarchyDir.getAbsolutePath(); + throw new IOException(message); + } + hierarchyDir.deleteOnExit(); + + FileUtils.copyFile(controllersFile, new File(hierarchyDir, + CGroupsHandler.CGROUP_CONTROLLERS_FILE)); + FileUtils.copyFile(subtreeControlFile, new File(hierarchyDir, + CGroupsHandler.CGROUP_SUBTREE_CONTROL_FILE)); + + return mockMtab; + } + + @Test + public void testHybridMtabParsing() throws Exception { + // Initialize mtab and cgroup dir + File v1ParentDir = new File(tmpPath); + + File v2ParentDir = new File(v1ParentDir, "unified"); + Assert.assertTrue("temp dir should be created", v2ParentDir.mkdirs()); + v2ParentDir.deleteOnExit(); + + // create mock cgroup + File mockMtabFile = createPremountedHybridCgroups(v1ParentDir); + + // create memory cgroup for v1 + File memoryCgroup = new File(v1ParentDir, "memory"); + assertTrue("Directory should be created", memoryCgroup.mkdirs()); + + // init v1 and v2 handlers + CGroupsHandlerImpl cGroupsHandler = new CGroupsHandlerImpl( + createMountConfiguration(), + privilegedOperationExecutorMock, mockMtabFile.getAbsolutePath()); + CGroupsV2HandlerImpl cGroupsV2Handler = new CGroupsV2HandlerImpl( + createMountConfiguration(), + privilegedOperationExecutorMock, mockMtabFile.getAbsolutePath()); + + // Verify resource handlers that are enabled in v1 + Map> newMtab = + cGroupsHandler.parseMtab(mockMtabFile.getAbsolutePath()); + Map controllerv1Paths = + cGroupsHandler.initializeControllerPathsFromMtab( + newMtab); + + Assert.assertEquals(1, controllerv1Paths.size()); + assertTrue(controllerv1Paths + .containsKey(CGroupsHandler.CGroupController.MEMORY)); + String memoryDir = + controllerv1Paths.get(CGroupsHandler.CGroupController.MEMORY); + Assert.assertEquals(memoryCgroup.getAbsolutePath(), memoryDir); + + // Verify resource handlers that are enabled in v2 + newMtab = + cGroupsV2Handler.parseMtab(mockMtabFile.getAbsolutePath()); + Map controllerPaths = + cGroupsV2Handler.initializeControllerPathsFromMtab( + newMtab); + + Assert.assertEquals(3, controllerPaths.size()); + assertTrue(controllerPaths + .containsKey(CGroupsHandler.CGroupController.CPU)); + String cpuDir = controllerPaths.get(CGroupsHandler.CGroupController.CPU); + Assert.assertEquals(v2ParentDir.getAbsolutePath(), cpuDir); + } + @Test public void testManualCgroupSetting() throws Exception { YarnConfiguration conf = new YarnConfiguration(); @@ -217,8 +322,27 @@ public void testManualCgroupSetting() throws Exception { conf.set(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_HIERARCHY, "/hadoop-yarn"); - File baseCgroup = new File(tmpPath); - File subCgroup = new File(tmpPath, "/hadoop-yarn"); + validateCgroupV2Controllers(conf, tmpPath); + } + + @Test + public void testManualHybridCgroupSetting() throws Exception { + String unifiedPath = tmpPath + "/unified"; + + YarnConfiguration conf = new YarnConfiguration(); + conf.set(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_MOUNT_PATH, tmpPath); + conf.set(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_V2_MOUNT_PATH, unifiedPath); + conf.set(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_HIERARCHY, + "/hadoop-yarn"); + + validateCgroupV1Controllers(conf, tmpPath); + validateCgroupV2Controllers(conf, unifiedPath); + } + + private void validateCgroupV2Controllers(YarnConfiguration conf, String mountPath) + throws Exception { + File baseCgroup = new File(mountPath); + File subCgroup = new File(mountPath, "/hadoop-yarn"); Assert.assertTrue("temp dir should be created", subCgroup.mkdirs()); subCgroup.deleteOnExit(); @@ -235,8 +359,8 @@ public void testManualCgroupSetting() throws Exception { cGroupsHandler.initializeCGroupController(CGroupsHandler.CGroupController.CPU); Assert.assertEquals("CPU cgroup path was not set", subCgroup.getAbsolutePath(), - new File(cGroupsHandler.getPathForCGroup( - CGroupsHandler.CGroupController.CPU, "")).getAbsolutePath()); + new File(cGroupsHandler.getPathForCGroup( + CGroupsHandler.CGroupController.CPU, "")).getAbsolutePath()); // Verify that the subtree control file was updated String subtreeControllersEnabledString = FileUtils.readFileToString(subtreeControlFile, @@ -276,4 +400,21 @@ public void testManualCgroupSetting() throws Exception { Assert.assertTrue("Controllers not enabled in subtree control file", cGroupsHandler.getValidCGroups().containsAll(subtreeControllersEnabled)); } + + private void validateCgroupV1Controllers(YarnConfiguration conf, String mountPath) + throws ResourceHandlerException { + File blkio = new File(new File(mountPath, "blkio"), "/hadoop-yarn"); + + Assert.assertTrue("temp dir should be created", blkio.mkdirs()); + + CGroupsHandlerImpl cGroupsv1Handler = new CGroupsHandlerImpl(conf, null); + cGroupsv1Handler.initializeCGroupController( + CGroupsHandler.CGroupController.BLKIO); + + Assert.assertEquals("BLKIO CGRoup path was not set", blkio.getAbsolutePath(), + new File(cGroupsv1Handler.getPathForCGroup( + CGroupsHandler.CGroupController.BLKIO, "")).getAbsolutePath()); + + FileUtils.deleteQuietly(blkio); + } } \ No newline at end of file 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/TestResourceHandlerModule.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/TestResourceHandlerModule.java index 9104defb92..171bfafc4f 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/TestResourceHandlerModule.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/TestResourceHandlerModule.java @@ -49,9 +49,6 @@ public void setup() throws Exception { networkEnabledConf.setBoolean(YarnConfiguration.NM_NETWORK_RESOURCE_ENABLED, true); ResourceHandlerModule.nullifyResourceHandlerChain(); - ResourceHandlerModule.resetCgroupsHandler(); - ResourceHandlerModule.resetCpuResourceHandler(); - ResourceHandlerModule.resetMemoryResourceHandler(); } @Test @@ -114,69 +111,4 @@ public void testDiskResourceHandler() throws Exception { Assert.fail("Null returned"); } } - - @Test - public void testCpuResourceHandlerClassForCgroupV1() throws ResourceHandlerException { - Configuration conf = new YarnConfiguration(); - conf.setBoolean(YarnConfiguration.NM_CPU_RESOURCE_ENABLED, true); - conf.setBoolean(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_V2_ENABLED, false); - - initResourceHandlerChain(conf); - - Assert.assertTrue(ResourceHandlerModule.getCpuResourceHandler() - instanceof CGroupsCpuResourceHandlerImpl); - Assert.assertTrue(ResourceHandlerModule.getCGroupsHandler() - instanceof CGroupsHandlerImpl); - } - - @Test - public void testCpuResourceHandlerClassForCgroupV2() throws ResourceHandlerException { - Configuration conf = new YarnConfiguration(); - conf.setBoolean(YarnConfiguration.NM_CPU_RESOURCE_ENABLED, true); - conf.setBoolean(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_V2_ENABLED, true); - - initResourceHandlerChain(conf); - - Assert.assertTrue(ResourceHandlerModule.getCpuResourceHandler() - instanceof CGroupsV2CpuResourceHandlerImpl); - Assert.assertTrue(ResourceHandlerModule.getCGroupsHandler() - instanceof CGroupsV2HandlerImpl); - } - - @Test - public void testMemoryResourceHandlerClassForCgroupV1() throws ResourceHandlerException { - Configuration conf = new YarnConfiguration(); - conf.setBoolean(YarnConfiguration.NM_MEMORY_RESOURCE_ENABLED, true); - conf.setBoolean(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_V2_ENABLED, false); - - initResourceHandlerChain(conf); - - Assert.assertTrue(ResourceHandlerModule.getMemoryResourceHandler() - instanceof CGroupsMemoryResourceHandlerImpl); - Assert.assertTrue(ResourceHandlerModule.getCGroupsHandler() - instanceof CGroupsHandlerImpl); - } - - @Test - public void testMemoryResourceHandlerClassForCgroupV2() throws ResourceHandlerException { - Configuration conf = new YarnConfiguration(); - conf.setBoolean(YarnConfiguration.NM_MEMORY_RESOURCE_ENABLED, true); - conf.setBoolean(YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_V2_ENABLED, true); - - initResourceHandlerChain(conf); - - Assert.assertTrue(ResourceHandlerModule.getMemoryResourceHandler() - instanceof CGroupsV2MemoryResourceHandlerImpl); - Assert.assertTrue(ResourceHandlerModule.getCGroupsHandler() - instanceof CGroupsV2HandlerImpl); - } - - private void initResourceHandlerChain(Configuration conf) throws ResourceHandlerException { - ResourceHandlerChain resourceHandlerChain = - ResourceHandlerModule.getConfiguredResourceHandlerChain(conf, - mock(Context.class)); - if (resourceHandlerChain == null) { - Assert.fail("Could not initialize resource handler chain"); - } - } } \ No newline at end of file