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