This is an automated email from the ASF dual-hosted git repository. ztang 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 269aa7e YARN-9785. Fix DominantResourceCalculator when one resource is zero. Contributed by Bibin A Chundatt, Sunil Govindan, Bilwa S T. 269aa7e is described below commit 269aa7ebfef0e22e25e26d22fe84c3fc14d04f06 Author: Zhankun Tang <zt...@apache.org> AuthorDate: Tue Sep 3 14:55:15 2019 +0800 YARN-9785. Fix DominantResourceCalculator when one resource is zero. Contributed by Bibin A Chundatt, Sunil Govindan, Bilwa S T. (cherry picked from commit bb26514ba9e8a038749c4acd592a47d5cd5bf92a) --- .../util/resource/DominantResourceCalculator.java | 26 +++++++++++++++++++++- .../yarn/util/resource/TestResourceCalculator.java | 23 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) 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 9aeb51c..e472149 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 @@ -102,7 +102,7 @@ public class DominantResourceCalculator extends ResourceCalculator { return 0; } - if (isInvalidDivisor(clusterResource)) { + if (isAllInvalidDivisor(clusterResource)) { return this.compare(lhs, rhs); } @@ -279,6 +279,11 @@ public class DominantResourceCalculator extends ResourceCalculator { firstShares[i] = calculateShare(clusterRes[i], firstRes[i]); secondShares[i] = calculateShare(clusterRes[i], secondRes[i]); + if (firstShares[i] == Float.POSITIVE_INFINITY || + secondShares[i] == Float.POSITIVE_INFINITY) { + continue; + } + if (firstShares[i] > max[0]) { max[0] = firstShares[i]; } @@ -297,6 +302,9 @@ public class DominantResourceCalculator extends ResourceCalculator { */ private double calculateShare(ResourceInformation clusterRes, ResourceInformation res) { + if(clusterRes.getValue() == 0) { + return Float.POSITIVE_INFINITY; + } return (double) res.getValue() / clusterRes.getValue(); } @@ -316,6 +324,10 @@ public class DominantResourceCalculator extends ResourceCalculator { // lhsShares and rhsShares must necessarily have the same length, because // everyone uses the same master resource list. for (int i = lhsShares.length - 1; i >= 0; i--) { + if (lhsShares[i] == Float.POSITIVE_INFINITY || + rhsShares[i] == Float.POSITIVE_INFINITY) { + continue; + } diff = lhsShares[i] - rhsShares[i]; if (diff != 0.0) { @@ -372,6 +384,18 @@ public class DominantResourceCalculator extends ResourceCalculator { return false; } + public boolean isAllInvalidDivisor(Resource r) { + boolean flag = true; + for (ResourceInformation res : r.getResources()) { + if (flag == true && res.getValue() == 0L) { + flag = true; + continue; + } + flag = false; + } + return flag; + } + @Override public float ratio(Resource a, Resource b) { float ratio = 0.0f; 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..58f40be 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 @@ -186,6 +186,7 @@ public class TestResourceCalculator { testCompareDefault(cluster); } else if (resourceCalculator instanceof DominantResourceCalculator) { testCompareDominant(cluster); + testCompareDominantZeroValueResource(); } } @@ -201,6 +202,28 @@ public class TestResourceCalculator { assertComparison(cluster, newResource(2, 1, 1), newResource(1, 0, 0), 1); } + /** + * Verify compare when one or all the resource are zero. + */ + private void testCompareDominantZeroValueResource(){ + Resource cluster = newResource(4L, 4, 0); + assertComparison(cluster, newResource(2, 1, 1), newResource(1, 1, 2), 1); + assertComparison(cluster, newResource(2, 2, 1), newResource(1, 2, 2), 1); + assertComparison(cluster, newResource(2, 2, 1), newResource(2, 2, 2), 0); + assertComparison(cluster, newResource(0, 2, 1), newResource(0, 2, 2), 0); + assertComparison(cluster, newResource(0, 1, 2), newResource(1, 1, 2), -1); + assertComparison(cluster, newResource(1, 1, 2), newResource(2, 1, 2), -1); + + // cluster resource zero + cluster = newResource(0, 0, 0); + assertComparison(cluster, newResource(2, 1, 1), newResource(1, 1, 1), 1); + assertComparison(cluster, newResource(2, 2, 2), newResource(1, 1, 1), 1); + assertComparison(cluster, newResource(2, 1, 1), newResource(1, 2, 1), 0); + assertComparison(cluster, newResource(1, 1, 1), newResource(1, 1, 1), 0); + assertComparison(cluster, newResource(1, 1, 1), newResource(1, 1, 2), -1); + assertComparison(cluster, newResource(1, 1, 1), newResource(1, 2, 1), -1); + } + private void testCompareDominant(Resource cluster) { assertComparison(cluster, newResource(2, 1, 1), newResource(2, 1, 1), 0); assertComparison(cluster, newResource(2, 1, 1), newResource(1, 2, 1), 0); --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org