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 6b284e3..522cb15 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 @@ -390,6 +390,9 @@ public float ratio(Resource a, Resource b) { long bResourceValue = UnitsConversionUtil.convert( bResourceInformation.getUnits(), aResourceInformation.getUnits(), bResourceInformation.getValue()); + if (aResourceInformation.getValue() == 0 && bResourceValue == 0) { + continue; + } float tmp = (float) aResourceInformation.getValue() / (float) bResourceValue; ratio = ratio > tmp ? ratio : tmp; 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 5f3ed19..3eb6854 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 @@ -392,4 +392,27 @@ public void testNormalize() { assertEquals(2, result.getVirtualCores()); } } + + @Test + public void testRatioWithResourceValuesContainZero() { + if (resourceCalculator instanceof DominantResourceCalculator) { + // Test with 3 resources + setupExtraResource(); + // Assert <6, 2, 0> / <10, 10, 0> = 0.6 + Resource left = Resource.newInstance(6, 2); + Resource right = Resource.newInstance(10, 10); + float ratio = resourceCalculator.ratio(left, right); + float delta = 0.00001f; + assertEquals(0.6f, ratio, delta); + // Assert <6, 2, 0> / <10, 10, 1> = 0.6 + right.setResourceValue("test", 1); + ratio = resourceCalculator.ratio(left, right); + assertEquals(0.6f, ratio, delta); + // Assert <6, 2, 1> / <10, 10, 0> = INFINITY + left.setResourceValue("test", 1); + right.setResourceValue("test", 0); + ratio = resourceCalculator.ratio(left, right); + assertEquals(Float.POSITIVE_INFINITY, ratio, delta); + } + } } \ No newline at end of file