diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java index 913513c..3d74361 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/FairSchedulerQueueInfo.java @@ -93,9 +93,13 @@ public FairSchedulerQueueInfo(FSQueue queue, FairScheduler scheduler) { fractionMemUsed = (float)usedResources.getMemorySize() / clusterResources.getMemorySize(); - steadyFairResources = new ResourceInfo(queue.getSteadyFairShare()); + steadyFairResources = new ResourceInfo( + Resources.componentwiseMin(queue.getSteadyFairShare(), + scheduler.getClusterResource())); fairResources = new ResourceInfo(queue.getFairShare()); - minResources = new ResourceInfo(queue.getMinShare()); + minResources = new ResourceInfo( + Resources.componentwiseMin(queue.getMinShare(), + scheduler.getClusterResource())); maxResources = new ResourceInfo( Resources.componentwiseMin(queue.getMaxShare(), scheduler.getClusterResource())); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/TestFairSchedulerQueueInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/TestFairSchedulerQueueInfo.java index 83b7e41..abd56d5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/TestFairSchedulerQueueInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/TestFairSchedulerQueueInfo.java @@ -19,11 +19,8 @@ package org.apache.hadoop.yarn.server.resourcemanager.webapp.dao; import org.apache.hadoop.yarn.api.records.Resource; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.AllocationConfiguration; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSQueue; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulerConfiguration; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.QueueManager; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.*; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.FifoPolicy; import org.apache.hadoop.yarn.util.SystemClock; import org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator; import org.junit.Assert; @@ -59,4 +56,37 @@ public void testEmptyChildQueues() throws Exception { Assert.assertNotNull(childQueues); Assert.assertEquals("Child QueueInfo was not empty", 0, childQueues.size()); } + + @Test + public void testClusterResLessThanMinRes() throws Exception { + // define the queue min resource to 8 vcores and 8192 mb + // so the steadyFairShare should be 0 vcores and 8192 mb + Resource minResource = Resource.newInstance(8192, 8); + Resource steadyFairShare = Resource.newInstance(8192, 0); + // Define the cluster resource to 4 vcores and 4096 less than min resource + Resource clusterResource = Resource.newInstance(4096, 4); + + FairSchedulerConfiguration conf = new FairSchedulerConfiguration(); + AllocationConfiguration allocConf = new AllocationConfiguration(conf); + FairScheduler scheduler = mock(FairScheduler.class); + when(scheduler.getClusterResource()).thenReturn(clusterResource); + when(scheduler.getAllocationConfiguration()).thenReturn(allocConf); + + FSQueue queue = mock(FSQueue.class); + when(queue.getMinShare()).thenReturn(minResource); + when(queue.getMaxShare()).thenReturn(minResource); + when(queue.getPolicy()).thenReturn(new FifoPolicy()); + when(queue.getMetrics()) + .thenReturn(FSQueueMetrics.forQueue("test", null, false, conf)); + when(queue.getSteadyFairShare()).thenReturn(steadyFairShare); + + + FairSchedulerQueueInfo queueInfo = + new FairSchedulerQueueInfo(queue, scheduler); + + Assert.assertEquals(4096, queueInfo.getMinResources().getMemorySize()); + Assert.assertEquals(4, queueInfo.getMinResources().getvCores()); + Assert.assertEquals(4096, queueInfo.getSteadyFairShare().getMemorySize()); + Assert.assertEquals(0, queueInfo.getSteadyFairShare().getvCores()); + } }