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/common/fica/FiCaSchedulerApp.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java index a12c5ec..faccebc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java @@ -989,11 +989,13 @@ public ApplicationResourceUsageReport getResourceUsageReport() { float queueAbsMaxCapPerPartition = ((AbstractCSQueue) getQueue()).getQueueCapacities() .getAbsoluteCapacity(getAppAMNodePartitionName()); - float queueUsagePerc = calc.divide(totalPartitionRes, - report.getUsedResources(), - Resources.multiply(totalPartitionRes, queueAbsMaxCapPerPartition)) - * 100; - report.setQueueUsagePercentage(queueUsagePerc); + if (queueAbsMaxCapPerPartition != 0) { + float queueUsagePerc = calc.divide(totalPartitionRes, + report.getUsedResources(), + Resources.multiply(totalPartitionRes, queueAbsMaxCapPerPartition)) + * 100; + report.setQueueUsagePercentage(queueUsagePerc); + } } return report; } finally { 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 1dea4ee..7cf4cf2 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 @@ -4879,4 +4879,32 @@ private void waitforNMRegistered(ResourceScheduler scheduler, int nodecount, } } } + + @Test (timeout = 60000) + public void testCalculateQueueUsagePercentageForZeroCapacityQueue() + throws Exception { + // init conf + CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration(); + conf.setCapacity("root.default", 100); + conf.setCapacity("root.a1", 0); + conf.setQueues("root", new String[] { "default", "a1" }); + conf.setInt(CapacitySchedulerConfiguration.QUEUE_GLOBAL_MAX_APPLICATION, + 20); + // init RM & NMs & Nodes + final MockRM rm = new MockRM(conf); + rm.start(); + final MockNM nm = rm.registerNode("h1:1234", 200 * GB); + // submit an app + RMApp app = rm.submitApp(1 * GB, "test", "user_0", null, "a1"); + final MockAM am = MockRM.launchAM(app, rm, nm); + rm.waitForState(app.getApplicationId(), RMAppState.ACCEPTED); + CapacityScheduler cs = (CapacityScheduler) rm.getRMContext().getScheduler(); + FiCaSchedulerApp schedulerApp = + cs.getApplicationAttempt(app.getCurrentAppAttempt().getAppAttemptId()); + ApplicationResourceUsageReport usageReport = + schedulerApp.getResourceUsageReport(); + Assert.assertEquals(0f, usageReport.getQueueUsagePercentage(), 0.001); + // close rm + rm.close(); + } }