diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java index 1b926a43e08..378febcb9ea 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java @@ -121,7 +121,7 @@ protected final MetricsSystem metricsSystem; protected final Map users; protected final Configuration conf; - private QueueMetricsForCustomResources queueMetricsForCustomResources; + protected QueueMetricsForCustomResources queueMetricsForCustomResources; private static final String ALLOCATED_RESOURCE_METRIC_PREFIX = "AllocatedResource."; @@ -449,25 +449,25 @@ public void incrPendingResources(String partition, String user, } } + protected Map getCustomResources() { + Map customResources = new HashMap(); + ResourceInformation[] resources = ResourceUtils.getResourceTypesArray(); + + for (int i = 2; i < resources.length; i++) { + ResourceInformation resource = resources[i]; + customResources.put(resource.getName(), Long.valueOf(0)); + } + return customResources; + } + /** * Register all custom resources metrics as part of initialization. As and * when this metric object construction happens for any queue, all custom * resource metrics value would be initialized with '0' like any other * mandatory resources metrics */ - private void registerCustomResources() { - Map customResources = - new HashMap(); - ResourceInformation[] resources = - ResourceUtils.getResourceTypesArray(); - - for (int i = - 2; i < resources.length; i++) { - ResourceInformation resource = - resources[i]; - customResources.put(resource.getName(), Long.valueOf(0)); - } - + protected void registerCustomResources() { + Map customResources = getCustomResources(); registerCustomResources(customResources, ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); registerCustomResources(customResources, AVAILABLE_RESOURCE_METRIC_PREFIX, @@ -481,7 +481,7 @@ private void registerCustomResources() { AGGREGATE_PREEMPTED_SECONDS_METRIC_DESC); } - private void registerCustomResources(Map customResources, + protected void registerCustomResources(Map customResources, String metricPrefix, String metricDesc) { for (Entry entry : customResources.entrySet()) { String resourceName = entry.getKey(); @@ -1007,4 +1007,9 @@ public void fillInValuesFromAvailableResources(Resource fromResource, } } } + + @VisibleForTesting + public QueueMetricsForCustomResources getQueueMetricsForCustomResource() { + return this.queueMetricsForCustomResources; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java index ddfffc8d13b..0f80a3c2e0d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java @@ -36,6 +36,10 @@ new QueueMetricsCustomResource(); private final QueueMetricsCustomResource pending = new QueueMetricsCustomResource(); + private final QueueMetricsCustomResource guaranteedCapacity = + new QueueMetricsCustomResource(); + private final QueueMetricsCustomResource maxCapacity = + new QueueMetricsCustomResource(); private final QueueMetricsCustomResource reserved = new QueueMetricsCustomResource(); @@ -111,4 +115,20 @@ QueueMetricsCustomResource getAggregatePreemptedSeconds() { public QueueMetricsCustomResource getAvailable() { return available; } + + public void setGuaranteedCapacity(Resource res) { + guaranteedCapacity.set(res); + } + + public void setMaxCapacity(Resource res) { + maxCapacity.set(res); + } + + public Map getGuaranteedCapacity() { + return guaranteedCapacity.getValues(); + } + + public Map getMaxCapacity() { + return maxCapacity.getValues(); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java index c50a1b145d3..08f632b7723 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java @@ -18,6 +18,9 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; +import java.util.HashMap; +import java.util.Map; + import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.metrics2.MetricsSystem; import org.apache.hadoop.metrics2.annotation.Metric; @@ -27,9 +30,12 @@ import org.apache.hadoop.metrics2.lib.MutableGaugeInt; import org.apache.hadoop.metrics2.lib.MutableGaugeLong; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceInformation; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetricsForCustomResources; +import org.apache.hadoop.yarn.util.resource.ResourceUtils; @Metrics(context = "yarn") public class CSQueueMetrics extends QueueMetrics { @@ -64,11 +70,36 @@ @Metric("Maximum capacity in percentage relative to total partition") private MutableGaugeFloat maxAbsoluteCapacity; + private static final String GUARANTEED_CAPACITY_METRIC_PREFIX = + "GuaranteedCapacity."; + private static final String GUARANTEED_CAPACITY_METRIC_DESC = + "GuaranteedCapacity of NAME"; + + private static final String MAXIMUM_CAPACITY_METRIC_PREFIX = + "MaximumCapacity."; + private static final String MAXIMUM_CAPACITY_METRIC_DESC = + "MaximumCapacity of NAME"; + CSQueueMetrics(MetricsSystem ms, String queueName, Queue parent, boolean enableUserMetrics, Configuration conf) { super(ms, queueName, parent, enableUserMetrics, conf); } + /** + * Register all custom resources metrics as part of initialization. As and + * when this metric object construction happens for any queue, all custom + * resource metrics value would be initialized with '0' like any other + * mandatory resources metrics + */ + protected void registerCustomResources() { + Map customResources = getCustomResources(); + registerCustomResources(customResources, GUARANTEED_CAPACITY_METRIC_PREFIX, + GUARANTEED_CAPACITY_METRIC_DESC); + registerCustomResources(customResources, MAXIMUM_CAPACITY_METRIC_PREFIX, + MAXIMUM_CAPACITY_METRIC_DESC); + super.registerCustomResources(); + } + public long getAMResourceLimitMB() { return AMResourceLimitMB.value(); } @@ -155,6 +186,13 @@ public void setGuaranteedResources(String partition, Resource res) { if (partition == null || partition.equals(RMNodeLabelsManager.NO_LABEL)) { guaranteedMB.set(res.getMemorySize()); guaranteedVCores.set(res.getVirtualCores()); + if (queueMetricsForCustomResources != null) { + queueMetricsForCustomResources.setGuaranteedCapacity(res); + registerCustomResources( + queueMetricsForCustomResources.getGuaranteedCapacity(), + GUARANTEED_CAPACITY_METRIC_PREFIX, + GUARANTEED_CAPACITY_METRIC_DESC); + } } } @@ -170,6 +208,12 @@ public void setMaxCapacityResources(String partition, Resource res) { if (partition == null || partition.equals(RMNodeLabelsManager.NO_LABEL)) { maxCapacityMB.set(res.getMemorySize()); maxCapacityVCores.set(res.getVirtualCores()); + if (queueMetricsForCustomResources != null) { + queueMetricsForCustomResources.setMaxCapacity(res); + registerCustomResources(queueMetricsForCustomResources.getMaxCapacity(), + MAXIMUM_CAPACITY_METRIC_PREFIX, + MAXIMUM_CAPACITY_METRIC_DESC); + } } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java index 3b72ca1c0e2..34454c05a5d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java @@ -32,10 +32,12 @@ import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.NodeState; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceInformation; import org.apache.hadoop.yarn.api.records.ResourceUtilization; import org.apache.hadoop.yarn.factories.RecordFactory; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager; +import org.apache.hadoop.yarn.resourcetypes.ResourceTypesTestHelper; import org.apache.hadoop.yarn.server.api.protocolrecords.NodeHeartbeatResponse; import org.apache.hadoop.yarn.server.api.records.OpportunisticContainersStatus; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; @@ -92,6 +94,12 @@ public static Resource newResource(int mem) { return rs; } + public static Resource newResource(long memory, int vCores, + Map customResources) { + return ResourceTypesTestHelper.newResource(memory, vCores, customResources); + } + + public static Resource newUsedResource(Resource total) { Resource rs = recordFactory.newRecordInstance(Resource.class); rs.setMemorySize((int)(Math.random() * total.getMemorySize())); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java index a18f2d2faad..78f2a43ea7a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java @@ -93,8 +93,8 @@ public static final long GB = 1024; // MB private static final Configuration CONF = new Configuration(); - private static final String CUSTOM_RES_1 = "custom_res_1"; - private static final String CUSTOM_RES_2 = "custom_res_2"; + public static final String CUSTOM_RES_1 = "custom_res_1"; + public static final String CUSTOM_RES_2 = "custom_res_2"; public static final String USER = "alice"; private Resource defaultResource; private MetricsSystem ms; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java index e8bada80ffe..64aa5c3d1ae 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java @@ -72,6 +72,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest; import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse; import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterRequest; +import org.apache.hadoop.yarn.api.protocolrecords.ResourceTypes; import org.apache.hadoop.yarn.api.records.ApplicationAccessType; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; @@ -92,6 +93,7 @@ import org.apache.hadoop.yarn.api.records.QueueState; import org.apache.hadoop.yarn.api.records.QueueUserACLInfo; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceInformation; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.api.records.UpdateContainerRequest; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -118,7 +120,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.TestAMAuthorization.MyContainerManager; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; - +import org.apache.hadoop.yarn.server.resourcemanager.resource.TestResourceProfiles; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppImpl; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppMetrics; @@ -144,6 +146,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicationAttempt; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNodeReport; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.TestQueueMetricsForCustomResources; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.TestSchedulerUtils; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.allocator.AllocationState; @@ -174,6 +177,7 @@ import org.apache.hadoop.yarn.server.utils.BuilderUtils; import org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator; import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator; +import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.ResourceUtils; import org.apache.hadoop.yarn.util.resource.Resources; import org.junit.After; @@ -5483,23 +5487,101 @@ public void testMoveAppWithActiveUsersWithOnlyPendingApps() throws Exception { @Test public void testCSQueueMetrics() throws Exception { - CapacityScheduler cs = new CapacityScheduler(); - cs.setConf(new YarnConfiguration()); - cs.setRMContext(resourceManager.getRMContext()); - CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration(); - setupQueueConfiguration(conf); - cs.init(conf); - cs.start(); - RMNode n1 = MockNodes.newNodeInfo(0, MockNodes.newResource(50 * GB), 1, "n1"); - RMNode n2 = MockNodes.newNodeInfo(0, MockNodes.newResource(50 * GB), 2, "n2"); + // Initialize resource map + Map riMap = new HashMap<>(); + + // Initialize mandatory resources + ResourceInformation memory = + ResourceInformation.newInstance(ResourceInformation.MEMORY_MB.getName(), + ResourceInformation.MEMORY_MB.getUnits(), + YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_MB, + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB); + ResourceInformation vcores = + ResourceInformation.newInstance(ResourceInformation.VCORES.getName(), + ResourceInformation.VCORES.getUnits(), + YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES, + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES); + riMap.put(ResourceInformation.MEMORY_URI, memory); + riMap.put(ResourceInformation.VCORES_URI, vcores); + riMap.put(TestQueueMetricsForCustomResources.CUSTOM_RES_1, + ResourceInformation.newInstance( + TestQueueMetricsForCustomResources.CUSTOM_RES_1, "", + YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_MB, + YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB)); + + ResourceUtils.initializeResourcesFromResourceInformationMap(riMap); + + CapacitySchedulerConfiguration csConf = + new CapacitySchedulerConfiguration(); + csConf.setResourceComparator(DominantResourceCalculator.class); + + csConf.set(YarnConfiguration.RESOURCE_TYPES, + TestQueueMetricsForCustomResources.CUSTOM_RES_1); + + setupQueueConfiguration(csConf); + + YarnConfiguration conf = new YarnConfiguration(csConf); + // Don't reset resource types since we have already configured resource + // types + + conf.setBoolean(TestResourceProfiles.TEST_CONF_RESET_RESOURCE_TYPES, false); + conf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class, + ResourceScheduler.class); + + MockRM rm = new MockRM(conf); + rm.start(); + + CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler(); + + RMNode n1 = MockNodes.newNodeInfo(0, + MockNodes.newResource(50 * GB, 50, + ImmutableMap. builder() + .put(TestQueueMetricsForCustomResources.CUSTOM_RES_1, + String.valueOf(10 * GB)) + .build()), + 1, "n1"); + RMNode n2 = MockNodes.newNodeInfo(0, + MockNodes.newResource(50 * GB, 50, + ImmutableMap. builder() + .put(TestQueueMetricsForCustomResources.CUSTOM_RES_1, + String.valueOf(20 * GB)) + .build()), + 2, "n2"); cs.handle(new NodeAddedSchedulerEvent(n1)); cs.handle(new NodeAddedSchedulerEvent(n2)); + Map guaranteedCap_A11 = + ((CSQueueMetrics) cs.getQueue("a1").getMetrics()) + .getQueueMetricsForCustomResource().getGuaranteedCapacity(); + assertEquals(0 * GB, guaranteedCap_A11 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + assertEquals(10240, ((CSQueueMetrics)cs.getQueue("a").getMetrics()).getGuaranteedMB()); assertEquals(71680, ((CSQueueMetrics)cs.getQueue("b1").getMetrics()).getGuaranteedMB()); + assertEquals(10240, ((CSQueueMetrics)cs.getQueue("a").getMetrics()).getGuaranteedMB()); assertEquals(102400, ((CSQueueMetrics)cs.getQueue("a").getMetrics()).getMaxCapacityMB()); assertEquals(102400, ((CSQueueMetrics)cs.getQueue("b1").getMetrics()).getMaxCapacityMB()); + Map guaranteedCap_A = + ((CSQueueMetrics) cs.getQueue("a").getMetrics()) + .getQueueMetricsForCustomResource().getGuaranteedCapacity(); + assertEquals(3 * GB, guaranteedCap_A + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map maxCap_A = + ((CSQueueMetrics) cs.getQueue("a").getMetrics()) + .getQueueMetricsForCustomResource().getMaxCapacity(); + assertEquals(30 * GB, maxCap_A + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map guaranteedCap_B1 = + ((CSQueueMetrics) cs.getQueue("b1").getMetrics()) + .getQueueMetricsForCustomResource().getGuaranteedCapacity(); + assertEquals(21504, guaranteedCap_B1 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map maxCap_B1 = + ((CSQueueMetrics) cs.getQueue("b1").getMetrics()) + .getQueueMetricsForCustomResource().getMaxCapacity(); + assertEquals(30 * GB, maxCap_B1 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); // Remove a node, metrics should be updated cs.handle(new NodeRemovedSchedulerEvent(n2)); @@ -5507,6 +5589,26 @@ public void testCSQueueMetrics() throws Exception { assertEquals(35840, ((CSQueueMetrics)cs.getQueue("b1").getMetrics()).getGuaranteedMB()); assertEquals(51200, ((CSQueueMetrics)cs.getQueue("a").getMetrics()).getMaxCapacityMB()); assertEquals(51200, ((CSQueueMetrics)cs.getQueue("b1").getMetrics()).getMaxCapacityMB()); + Map guaranteedCap_A1 = + ((CSQueueMetrics) cs.getQueue("a").getMetrics()) + .getQueueMetricsForCustomResource().getGuaranteedCapacity(); + assertEquals(1024, guaranteedCap_A1 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map maxCap_A1 = + ((CSQueueMetrics) cs.getQueue("a").getMetrics()) + .getQueueMetricsForCustomResource().getMaxCapacity(); + assertEquals(10 * GB, maxCap_A1 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map guaranteedCap_B11 = + ((CSQueueMetrics) cs.getQueue("b1").getMetrics()) + .getQueueMetricsForCustomResource().getGuaranteedCapacity(); + assertEquals(7168, guaranteedCap_B11 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map maxCap_B11 = + ((CSQueueMetrics) cs.getQueue("b1").getMetrics()) + .getQueueMetricsForCustomResource().getMaxCapacity(); + assertEquals(10 * GB, maxCap_B11 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); assertEquals(A_CAPACITY / 100, ((CSQueueMetrics)cs.getQueue("a") .getMetrics()).getGuaranteedCapacity(), DELTA); assertEquals(A_CAPACITY / 100, ((CSQueueMetrics)cs.getQueue("a") @@ -5525,20 +5627,42 @@ public void testCSQueueMetrics() throws Exception { .getMaxAbsoluteCapacity(), DELTA); // Add child queue to a, and reinitialize. Metrics should be updated - conf.setQueues(CapacitySchedulerConfiguration.ROOT + ".a", new String[] {"a1", "a2", "a3"} ); - conf.setCapacity(CapacitySchedulerConfiguration.ROOT + ".a.a2", 30.0f); - conf.setCapacity(CapacitySchedulerConfiguration.ROOT + ".a.a3", 40.0f); - conf.setMaximumCapacity(CapacitySchedulerConfiguration.ROOT + ".a.a3", 50.0f); - - cs.reinitialize(conf, new RMContextImpl(null, null, null, null, null, - null, new RMContainerTokenSecretManager(conf), - new NMTokenSecretManagerInRM(conf), + csConf.setQueues(CapacitySchedulerConfiguration.ROOT + ".a", new String[] {"a1", "a2", "a3"} ); + csConf.setCapacity(CapacitySchedulerConfiguration.ROOT + ".a.a2", 29.5f); + csConf.setCapacity(CapacitySchedulerConfiguration.ROOT + ".a.a3", 40.5f); + csConf.setMaximumCapacity(CapacitySchedulerConfiguration.ROOT + ".a.a3", 50.0f); + + cs.reinitialize(csConf, new RMContextImpl(null, null, null, null, null, + null, new RMContainerTokenSecretManager(csConf), + new NMTokenSecretManagerInRM(csConf), new ClientToAMTokenSecretManagerInRM(), null)); assertEquals(1024, ((CSQueueMetrics)cs.getQueue("a2").getMetrics()).getGuaranteedMB()); assertEquals(2048, ((CSQueueMetrics)cs.getQueue("a3").getMetrics()).getGuaranteedMB()); assertEquals(51200, ((CSQueueMetrics)cs.getQueue("a2").getMetrics()).getMaxCapacityMB()); assertEquals(25600, ((CSQueueMetrics)cs.getQueue("a3").getMetrics()).getMaxCapacityMB()); + + Map guaranteedCap_A2 = + ((CSQueueMetrics) cs.getQueue("a2").getMetrics()) + .getQueueMetricsForCustomResource().getGuaranteedCapacity(); + assertEquals(0, guaranteedCap_A2 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map maxCap_A2 = + ((CSQueueMetrics) cs.getQueue("a2").getMetrics()) + .getQueueMetricsForCustomResource().getMaxCapacity(); + assertEquals(10 * GB, maxCap_A2 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + + Map guaranteedCap_A3 = + ((CSQueueMetrics) cs.getQueue("a3").getMetrics()) + .getQueueMetricsForCustomResource().getGuaranteedCapacity(); + assertEquals(0, guaranteedCap_A3 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); + Map maxCap_A3 = + ((CSQueueMetrics) cs.getQueue("a3").getMetrics()) + .getQueueMetricsForCustomResource().getMaxCapacity(); + assertEquals(5 * GB, maxCap_A3 + .get(TestQueueMetricsForCustomResources.CUSTOM_RES_1).longValue()); } @Test