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 <[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 | 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: [email protected]
For additional commands, e-mail: [email protected]