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
404a7e75a2

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

@@ -717,6 +717,9 @@ public class SchedulerApplicationAttempt implements SchedulableEntity {
       queueUsagePerc =
           calc.divide(cluster, usedResourceClone, Resources.multiply(cluster,
               queue.getQueueInfo(false, false).getCapacity())) * 100;
+      if (Float.isNaN(queueUsagePerc) || Float.isInfinite(queueUsagePerc)) {
+        queueUsagePerc = 0.0f;
+      }
       clusterUsagePerc = calc.divide(cluster, usedResourceClone, cluster) * 100;
     }
     return ApplicationResourceUsageReport.newInstance(liveContainers.size(),

+ 3 - 1
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

@@ -657,7 +657,9 @@ public class FiCaSchedulerApp extends SchedulerApplicationAttempt {
           calc.divide(totalPartitionRes, report.getUsedResources(),
               Resources.multiply(totalPartitionRes,
                   queueAbsMaxCapPerPartition)) * 100;
-      report.setQueueUsagePercentage(queueUsagePerc);
+      if (!(Float.isInfinite(queueUsagePerc) || Float.isNaN(queueUsagePerc))) {
+        report.setQueueUsagePercentage(queueUsagePerc);
+      }
     }
     return report;
   }

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

@@ -267,6 +267,19 @@ public class TestSchedulerApplicationAttempt {
         0.01f);
     assertEquals(60.0f,
         app.getResourceUsageReport().getClusterUsagePercentage(), 0.01f);
+
+    // Test NaN values and Infinite values
+    queue = createQueue("test3", null, Float.MIN_VALUE);
+    app = new SchedulerApplicationAttempt(appAttId, user, queue,
+        queue.getActiveUsersManager(), rmContext);
+
+    // Resource request
+    app.attemptResourceUsage.incUsed(requestedResource);
+
+    assertEquals(0.0f, app.getResourceUsageReport().getQueueUsagePercentage(),
+        0.01f);
+    assertEquals(15.0f,
+        app.getResourceUsageReport().getClusterUsagePercentage(), 0.01f);
   }
 
   @Test

+ 8 - 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

@@ -3351,6 +3351,14 @@ 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);
+    app = new FiCaSchedulerApp(appAttId, user, zeroQueue,
+        qChild.getActiveUsersManager(), rmContext);
+    app.getAppAttemptResourceUsage().incUsed(requestedResource);
+    assertEquals(0.0f, app.getResourceUsageReport().getQueueUsagePercentage(), 0.01f);
   }
 
   private ApplicationAttemptId createAppAttemptId(int appId, int attemptId) {