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 6fed23b..b9ed6c1 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 diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java index 25e535a..86491bf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java @@ -523,7 +523,8 @@ public void testAllocationForReservedContainer() throws Exception { } @Test(timeout = 60000) - public void testReservedContainerMetricsOnDecommisionedNode() throws Exception { + public void testReservedContainerMetricsOnDecommisionedNode() + throws Exception { /** * Test case: Submit two application (app1/app2) to a queue. And there's one * node with 8G resource in the cluster. App1 allocates a 6G container, Then @@ -649,7 +650,8 @@ public void testAssignMultipleOffswitchContainers() throws Exception { } @Test(timeout = 60000) - public void testContinuousReservationLookingWhenUsedEqualsMax() throws Exception { + public void testContinuousReservationLookingWhenUsedEqualsMax() + throws Exception { CapacitySchedulerConfiguration newConf = (CapacitySchedulerConfiguration) TestUtils .getConfigurationWithMultipleQueues(conf);