Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java (revision 1494852) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java (working copy) @@ -201,9 +201,9 @@ capacity, absoluteCapacity, maximumCapacity, absoluteMaxCapacity, userLimit, userLimitFactor, - maxApplications, maxApplicationsPerUser, - maxActiveApplications, maxActiveApplicationsPerUser, - state, acls, cs.getConfiguration().getNodeLocalityDelay()); + maxApplications, maxAMResourcePerQueuePercent, maxApplicationsPerUser, + maxActiveApplications, maxActiveApplicationsPerUser, state, acls, cs + .getConfiguration().getNodeLocalityDelay()); if(LOG.isDebugEnabled()) { LOG.debug("LeafQueue:" + " name=" + queueName @@ -222,10 +222,10 @@ float capacity, float absoluteCapacity, float maximumCapacity, float absoluteMaxCapacity, int userLimit, float userLimitFactor, - int maxApplications, int maxApplicationsPerUser, - int maxActiveApplications, int maxActiveApplicationsPerUser, - QueueState state, Map acls, - int nodeLocalityDelay) + int maxApplications, float maxAMResourcePerQueuePercent, + int maxApplicationsPerUser, int maxActiveApplications, + int maxActiveApplicationsPerUser, QueueState state, + Map acls, int nodeLocalityDelay) { // Sanity check CSQueueUtils.checkMaxCapacity(getQueueName(), capacity, maximumCapacity); @@ -242,6 +242,7 @@ this.userLimitFactor = userLimitFactor; this.maxApplications = maxApplications; + this.maxAMResourcePerQueuePercent = maxAMResourcePerQueuePercent; this.maxApplicationsPerUser = maxApplicationsPerUser; this.maxActiveApplications = maxActiveApplications; @@ -603,6 +604,7 @@ newlyParsedLeafQueue.absoluteMaxCapacity, newlyParsedLeafQueue.userLimit, newlyParsedLeafQueue.userLimitFactor, newlyParsedLeafQueue.maxApplications, + newlyParsedLeafQueue.maxAMResourcePerQueuePercent, newlyParsedLeafQueue.getMaxApplicationsPerUser(), newlyParsedLeafQueue.getMaximumActiveApplications(), newlyParsedLeafQueue.getMaximumActiveApplicationsPerUser(), Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java (revision 1494852) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java (working copy) @@ -43,7 +43,6 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; -import org.apache.hadoop.yarn.api.records.ResourceBlacklistRequest; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerStatus; @@ -1956,7 +1955,51 @@ assertEquals(0, app_0.getTotalRequiredResources(priority)); } + + @Test + public void testmaxAMResourcePerQueuePercentAfterQueueRefresh() + throws Exception { + CapacitySchedulerConfiguration csConf = new CapacitySchedulerConfiguration(); + Resource clusterResource = Resources + .createResource(100 * 16 * GB, 100 * 32); + CapacitySchedulerContext csContext = mockCSContext(csConf, clusterResource); + csConf.setFloat(CapacitySchedulerConfiguration. + MAXIMUM_APPLICATION_MASTERS_RESOURCE_PERCENT, 0.1f); + ParentQueue root = new ParentQueue(csContext, + CapacitySchedulerConfiguration.ROOT, null, null); + csConf.setCapacity(CapacitySchedulerConfiguration.ROOT + "." + A, 80); + LeafQueue a = new LeafQueue(csContext, A, root, null); + // 100 * 16 * 0.1 = 160 + assertEquals(160, a.getMaximumActiveApplications()); + + csConf.setFloat(CapacitySchedulerConfiguration. + MAXIMUM_APPLICATION_MASTERS_RESOURCE_PERCENT, 0.2f); + LeafQueue newA = new LeafQueue(csContext, A, root, null); + a.reinitialize(newA, clusterResource); + // 100 * 16 * 0.2 = 320 + assertEquals(320, a.getMaximumActiveApplications()); + Resource newClusterResource = Resources.createResource(100 * 20 * GB, + 100 * 32); + a.updateClusterResource(newClusterResource); + // 100 * 20 * 0.2 = 400 + assertEquals(400, a.getMaximumActiveApplications()); + } + + private CapacitySchedulerContext mockCSContext( + CapacitySchedulerConfiguration csConf, Resource clusterResource) { + CapacitySchedulerContext csContext = mock(CapacitySchedulerContext.class); + when(csContext.getConfiguration()).thenReturn(csConf); + when(csContext.getConf()).thenReturn(new YarnConfiguration()); + when(csContext.getResourceCalculator()).thenReturn(resourceCalculator); + when(csContext.getClusterResources()).thenReturn(clusterResource); + when(csContext.getMinimumResourceCapability()).thenReturn( + Resources.createResource(GB, 1)); + when(csContext.getMaximumResourceCapability()).thenReturn( + Resources.createResource(2 * GB, 2)); + return csContext; + } + @After public void tearDown() throws Exception { }