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]