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

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


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

commit e0baa03d97436bf858e70de9f983a99d55823925
Author: Haibo Chen <[email protected]>
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 | 26 +++++++++++++++++-----
 4 files changed, 41 insertions(+), 9 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 c851dbafd01..0f6c3f99826 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 1e84651ea11..8a03421f687 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
@@ -415,8 +415,8 @@ public class DominantResourceCalculator extends 
ResourceCalculator {
       long bResourceValue = UnitsConversionUtil.convert(
           bResourceInformation.getUnits(), aResourceInformation.getUnits(),
           bResourceInformation.getValue());
-      float tmp = (float) aResourceInformation.getValue()
-          / (float) bResourceValue;
+      final float tmp = divideSafelyAsFloat(aResourceInformation.getValue(),
+          bResourceValue);
       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 46c7c15d173..82d8a96c616 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 13b0dd8d1a8..1d540fce6dd 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
@@ -37,11 +37,11 @@ import static org.junit.Assert.assertTrue;
 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
@@ -58,7 +58,7 @@ public class TestResourceCalculator {
     ResourceUtils.resetResourceTypes(conf);
   }
 
-  public TestResourceCalculator(ResourceCalculator rs) {
+  public TestResourceCalculator(String name, ResourceCalculator rs) {
     this.resourceCalculator = rs;
   }
   
@@ -417,4 +417,18 @@ public class TestResourceCalculator {
       assertEquals(2, result.getVirtualCores());
     }
   }
+
+  @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);
+  }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to