diff --git 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 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 7507a82..53cae86 100644 --- 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 +++ 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,7 +63,7 @@ /** * Returns an initialized, thread-safe CGroupsHandler instance. */ - public static CGroupsHandler getCGroupsHandler(Configuration conf) + private static CGroupsHandler getInitializedCGroupsHandler(Configuration conf) throws ResourceHandlerException { if (cGroupsHandler == null) { synchronized (CGroupsHandler.class) { @@ -77,6 +77,16 @@ public static CGroupsHandler getCGroupsHandler(Configuration conf) return cGroupsHandler; } + /** + * Returns a (possibly null) reference to a cGroupsHandler. This handler is + * non-null only if one or more of the known cgroups-based resource + * handlers are in use and have been initialized. + */ + + public static CGroupsHandler getCGroupsHandler() { + return cGroupsHandler; + } + private static CGroupsCpuResourceHandlerImpl getcGroupsCpuResourceHandler( Configuration conf) throws ResourceHandlerException { boolean cgroupsCpuEnabled = @@ -92,7 +102,7 @@ private static CGroupsCpuResourceHandlerImpl getcGroupsCpuResourceHandler( if (cGroupsCpuResourceHandler == null) { LOG.debug("Creating new cgroups cpu handler"); cGroupsCpuResourceHandler = - new CGroupsCpuResourceHandlerImpl(getCGroupsHandler(conf)); + new CGroupsCpuResourceHandlerImpl(getInitializedCGroupsHandler(conf)); return cGroupsCpuResourceHandler; } } @@ -112,7 +122,7 @@ private static CGroupsCpuResourceHandlerImpl getcGroupsCpuResourceHandler( LOG.debug("Creating new traffic control bandwidth handler"); trafficControlBandwidthHandler = new TrafficControlBandwidthHandlerImpl(PrivilegedOperationExecutor - .getInstance(conf), getCGroupsHandler(conf), + .getInstance(conf), getInitializedCGroupsHandler(conf), new TrafficController(conf, PrivilegedOperationExecutor .getInstance(conf))); } @@ -147,7 +157,7 @@ private static CGroupsBlkioResourceHandlerImpl getCgroupsBlkioResourceHandler( if (cGroupsBlkioResourceHandler == null) { LOG.debug("Creating new cgroups blkio handler"); cGroupsBlkioResourceHandler = - new CGroupsBlkioResourceHandlerImpl(getCGroupsHandler(conf)); + new CGroupsBlkioResourceHandlerImpl(getInitializedCGroupsHandler(conf)); } } } @@ -170,7 +180,7 @@ public static MemoryResourceHandler getMemoryResourceHandler( synchronized (MemoryResourceHandler.class) { if (cGroupsMemoryResourceHandler == null) { cGroupsMemoryResourceHandler = - new CGroupsMemoryResourceHandlerImpl(getCGroupsHandler(conf)); + new CGroupsMemoryResourceHandlerImpl(getInitializedCGroupsHandler(conf)); } } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java index 7adba4d..2a6ee72 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DelegatingLinuxContainerRuntime.java @@ -49,12 +49,8 @@ public void initialize(Configuration conf) PrivilegedOperationExecutor privilegedOperationExecutor = PrivilegedOperationExecutor.getInstance(conf); CGroupsHandler cGroupsHandler; - try { - cGroupsHandler = ResourceHandlerModule.getCGroupsHandler(conf); - } catch (ResourceHandlerException e) { - LOG.error("Unable to get cgroups handle."); - throw new ContainerExecutionException(e); - } + + cGroupsHandler = ResourceHandlerModule.getCGroupsHandler(); defaultLinuxContainerRuntime = new DefaultLinuxContainerRuntime( privilegedOperationExecutor); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java index 2dee663..898db31 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java @@ -91,7 +91,14 @@ public static boolean isDockerContainerRequested( public DockerLinuxContainerRuntime(PrivilegedOperationExecutor privilegedOperationExecutor, CGroupsHandler cGroupsHandler) { this.privilegedOperationExecutor = privilegedOperationExecutor; - this.cGroupsHandler = cGroupsHandler; + + if (cGroupsHandler == null) { + if (LOG.isInfoEnabled()) { + LOG.info("cGroupsHandler is null - cgroups not in use."); + } + } else { + this.cGroupsHandler = cGroupsHandler; + } } @Override @@ -113,6 +120,14 @@ public void prepareContainer(ContainerRuntimeContext ctx) public void addCGroupParentIfRequired(String resourcesOptions, String containerIdStr, DockerRunCommand runCommand) throws ContainerExecutionException { + if (cGroupsHandler == null) { + if (LOG.isDebugEnabled()) { + LOG.debug("cGroupsHandler is null. cgroups are not in use. nothing to" + + " do."); + } + return; + } + if (resourcesOptions.equals( (PrivilegedOperation.CGROUP_ARG_PREFIX + PrivilegedOperation .CGROUP_ARG_NO_TASKS))) { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java index 6898634..e05719c 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java @@ -429,5 +429,20 @@ public void testCGroupParent() throws ContainerExecutionException { //--cgroup-parent should be added for the containerId in question String expectedPath = "/" + hierarchy + "/" + containerIdStr; Mockito.verify(command).setCGroupParent(expectedPath); + + //create a runtime with a 'null' cgroups handler - i.e no + // cgroup-based resource handlers are in use. + + runtime = new DockerLinuxContainerRuntime + (mockExecutor, null); + runtime.initialize(conf); + + runtime.addCGroupParentIfRequired(resourceOptionsNone, containerIdStr, + command); + runtime.addCGroupParentIfRequired(resourceOptionsCpu, containerIdStr, + command); + + //no --cgroup-parent should be added in either case + Mockito.verifyZeroInteractions(command); } }