Browse Source

YARN-9563. Resource report REST API could return NaN or Inf (Ahmed Hussein via jeagles)

Signed-off-by: Jonathan Eagles <jeagles@gmail.com>
Ahmed Hussein 6 năm trước cách đây
mục cha
commit
abf76ac371

+ 4 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java

@@ -1125,9 +1125,10 @@ public class SchedulerApplicationAttempt implements SchedulableEntity {
       if (!calc.isInvalidDivisor(cluster)) {
         float queueCapacityPerc = queue.getQueueInfo(false, false)
             .getCapacity();
-        if (queueCapacityPerc != 0) {
-          queueUsagePerc = calc.divide(cluster, usedResourceClone,
-              Resources.multiply(cluster, queueCapacityPerc)) * 100;
+        queueUsagePerc = calc.divide(cluster, usedResourceClone,
+            Resources.multiply(cluster, queueCapacityPerc)) * 100;
+        if (Float.isNaN(queueUsagePerc) || Float.isInfinite(queueUsagePerc)) {
+          queueUsagePerc = 0.0f;
         }
         clusterUsagePerc =
             calc.divide(cluster, usedResourceClone, cluster) * 100;

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerApplicationAttempt.java

@@ -276,7 +276,7 @@ public class TestSchedulerApplicationAttempt {
     assertEquals(60.0f,
         app.getResourceUsageReport().getClusterUsagePercentage(), 0.01f);
 
-    queue = createQueue("test3", null, 0.0f);
+    queue = createQueue("test3", null, Float.MIN_VALUE);
     app = new SchedulerApplicationAttempt(appAttId, user, queue,
         queue.getAbstractUsersManager(), rmContext);
 

+ 10 - 0
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

@@ -4039,6 +4039,16 @@ public class TestLeafQueue {
         0.01f);
     assertEquals(15.0f,
         app.getResourceUsageReport().getClusterUsagePercentage(), 0.01f);
+
+    // test that queueUsagePercentage returns neither NaN nor Infinite
+    AbstractCSQueue zeroQueue = createQueue("test2.2", null,
+        Float.MIN_VALUE, Float.MIN_VALUE,
+        Resources.multiply(res, Float.MIN_VALUE));
+    app = new FiCaSchedulerApp(appAttId, user, zeroQueue,
+        qChild.getAbstractUsersManager(), rmContext);
+    app.getAppAttemptResourceUsage().incUsed(requestedResource);
+    assertEquals(0.0f, app.getResourceUsageReport().getQueueUsagePercentage(),
+        0.01f);
   }
 
   @Test