This is an automated email from the ASF dual-hosted git repository.

epayne pushed a commit to branch branch-3.2
in repository https://gitbox.apache.org/repos/asf/hadoop.git


The following commit(s) were added to refs/heads/branch-3.2 by this push:
     new cc90f03b105 YARN-9019. Ratio calculation of ResourceCalculator 
implementations could return NaN. (Contributed by Szilard Nemeth)
cc90f03b105 is described below

commit cc90f03b105b2b664b92872e303299a998f37906
Author: Haibo Chen <haiboc...@apache.org>
AuthorDate: Wed Dec 5 15:15:30 2018 -0800

    YARN-9019. Ratio calculation of ResourceCalculator implementations could 
return NaN. (Contributed by Szilard Nemeth)
    
    (cherry picked from commit 912b1f9d64a61ef2663d95e2b4f286e6ee8d5ff9)
---
 .../util/resource/DefaultResourceCalculator.java   |  2 +-
 .../util/resource/DominantResourceCalculator.java  |  4 ++--
 .../yarn/util/resource/ResourceCalculator.java     | 18 ++++++++++++++
 .../yarn/util/resource/TestResourceCalculator.java | 28 ++++++++++++++++------
 4 files changed, 42 insertions(+), 10 deletions(-)

diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java
index d828e365e72..f3044415ecc 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DefaultResourceCalculator.java
@@ -57,7 +57,7 @@ public class DefaultResourceCalculator extends 
ResourceCalculator {
 
   @Override
   public float ratio(Resource a, Resource b) {
-    return (float)a.getMemorySize() / b.getMemorySize();
+    return divideSafelyAsFloat(a.getMemorySize(), b.getMemorySize());
   }
 
   @Override
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
index ee3152fdb56..0d502ad0f9b 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java
@@ -404,8 +404,8 @@ public class DominantResourceCalculator extends 
ResourceCalculator {
     for (int i = 0; i < maxLength; i++) {
       ResourceInformation aResourceInformation = a.getResourceInformation(i);
       ResourceInformation bResourceInformation = b.getResourceInformation(i);
-      float tmp = (float) aResourceInformation.getValue()
-          / (float) bResourceInformation.getValue();
+      final float tmp = divideSafelyAsFloat(aResourceInformation.getValue(),
+          bResourceInformation.getValue());
       ratio = ratio > tmp ? ratio : tmp;
     }
     return ratio;
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java
index dd4f116304d..396a60086f6 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/ResourceCalculator.java
@@ -87,6 +87,24 @@ public abstract class ResourceCalculator {
     return (long) Math.ceil(a/b);
   }
 
+  /**
+   * Divides lhs by rhs.
+   * If both lhs and rhs are having a value of 0, then we return 0.
+   * This is to avoid division by zero and return NaN as a result.
+   * If lhs is zero but rhs is not, Float.infinity will be returned
+   * as the result.
+   * @param lhs
+   * @param rhs
+   * @return
+   */
+  public static float divideSafelyAsFloat(long lhs, long rhs) {
+    if (lhs == 0 && rhs == 0) {
+      return 0;
+    } else {
+      return (float) lhs / (float) rhs;
+    }
+  }
+
   public static int roundUp(int a, int b) {
     return divideAndCeil(a, b) * b;
   }
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceCalculator.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceCalculator.java
index 1a7599fe309..2d4f1cf55ee 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceCalculator.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceCalculator.java
@@ -38,11 +38,11 @@ public class TestResourceCalculator {
 
   private final ResourceCalculator resourceCalculator;
 
-  @Parameterized.Parameters
-  public static Collection<ResourceCalculator[]> getParameters() {
-    return Arrays.asList(new ResourceCalculator[][] {
-        { new DefaultResourceCalculator() },
-        { new DominantResourceCalculator() } });
+  @Parameterized.Parameters(name = "{0}")
+  public static Collection<Object[]> getParameters() {
+    return Arrays.asList(new Object[][] {
+        { "DefaultResourceCalculator", new DefaultResourceCalculator() },
+        { "DominantResourceCalculator", new DominantResourceCalculator() } });
   }
 
   @Before
@@ -59,7 +59,7 @@ public class TestResourceCalculator {
     ResourceUtils.resetResourceTypes(conf);
   }
 
-  public TestResourceCalculator(ResourceCalculator rs) {
+  public TestResourceCalculator(String name, ResourceCalculator rs) {
     this.resourceCalculator = rs;
   }
   
@@ -456,4 +456,18 @@ public class TestResourceCalculator {
       assertEquals(ratioOfExtraResources, ratio, 0.00001);
     }
   }
-}
\ No newline at end of file
+
+  @Test
+  public void testDivisionByZeroRatioDenominatorIsZero() {
+    float ratio = resourceCalculator.ratio(newResource(1, 1), newResource(0,
+        0));
+    assertEquals(Float.POSITIVE_INFINITY, ratio, 0.00001);
+  }
+
+  @Test
+  public void testDivisionByZeroRatioNumeratorAndDenominatorIsZero() {
+    float ratio = resourceCalculator.ratio(newResource(0, 0), newResource(0,
+        0));
+    assertEquals(0.0, ratio, 0.00001);
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to