Skip to content

Commit 1c49805

Browse files
tangzhankunahussein
authored andcommitted
YARN-9785. Fix DominantResourceCalculator when one resource is zero. Contributed by Bibin A Chundatt, Sunil Govindan, Bilwa S T.
1 parent 62cddc1 commit 1c49805

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/resource/DominantResourceCalculator.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public int compare(Resource clusterResource, Resource lhs, Resource rhs,
106106
return 0;
107107
}
108108

109-
if (isInvalidDivisor(clusterResource)) {
109+
if (isAllInvalidDivisor(clusterResource)) {
110110
return this.compare(lhs, rhs);
111111
}
112112

@@ -283,6 +283,11 @@ private void calculateShares(ResourceInformation[] clusterRes, Resource first,
283283
firstShares[i] = calculateShare(clusterRes[i], firstRes[i]);
284284
secondShares[i] = calculateShare(clusterRes[i], secondRes[i]);
285285

286+
if (firstShares[i] == Float.POSITIVE_INFINITY ||
287+
secondShares[i] == Float.POSITIVE_INFINITY) {
288+
continue;
289+
}
290+
286291
if (firstShares[i] > max[0]) {
287292
max[0] = firstShares[i];
288293
}
@@ -301,6 +306,9 @@ private void calculateShares(ResourceInformation[] clusterRes, Resource first,
301306
*/
302307
private double calculateShare(ResourceInformation clusterRes,
303308
ResourceInformation res) {
309+
if(clusterRes.getValue() == 0) {
310+
return Float.POSITIVE_INFINITY;
311+
}
304312
return (double) res.getValue() / clusterRes.getValue();
305313
}
306314

@@ -320,6 +328,10 @@ private double compareShares(double[] lhsShares, double[] rhsShares) {
320328
// lhsShares and rhsShares must necessarily have the same length, because
321329
// everyone uses the same master resource list.
322330
for (int i = lhsShares.length - 1; i >= 0; i--) {
331+
if (lhsShares[i] == Float.POSITIVE_INFINITY ||
332+
rhsShares[i] == Float.POSITIVE_INFINITY) {
333+
continue;
334+
}
323335
diff = lhsShares[i] - rhsShares[i];
324336

325337
if (diff != 0.0) {
@@ -376,6 +388,18 @@ public boolean isInvalidDivisor(Resource r) {
376388
return false;
377389
}
378390

391+
public boolean isAllInvalidDivisor(Resource r) {
392+
boolean flag = true;
393+
for (ResourceInformation res : r.getResources()) {
394+
if (flag == true && res.getValue() == 0L) {
395+
flag = true;
396+
continue;
397+
}
398+
flag = false;
399+
}
400+
return flag;
401+
}
402+
379403
@Override
380404
public float ratio(Resource a, Resource b) {
381405
float ratio = 0.0f;

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/resource/TestResourceCalculator.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ public void testCompare() {
188188
testCompareDefault(cluster);
189189
} else if (resourceCalculator instanceof DominantResourceCalculator) {
190190
testCompareDominant(cluster);
191+
testCompareDominantZeroValueResource();
191192
}
192193
}
193194

@@ -203,6 +204,28 @@ private void testCompareDefault(Resource cluster) {
203204
assertComparison(cluster, newResource(2, 1, 1), newResource(1, 0, 0), 1);
204205
}
205206

207+
/**
208+
* Verify compare when one or all the resource are zero.
209+
*/
210+
private void testCompareDominantZeroValueResource(){
211+
Resource cluster = newResource(4L, 4, 0);
212+
assertComparison(cluster, newResource(2, 1, 1), newResource(1, 1, 2), 1);
213+
assertComparison(cluster, newResource(2, 2, 1), newResource(1, 2, 2), 1);
214+
assertComparison(cluster, newResource(2, 2, 1), newResource(2, 2, 2), 0);
215+
assertComparison(cluster, newResource(0, 2, 1), newResource(0, 2, 2), 0);
216+
assertComparison(cluster, newResource(0, 1, 2), newResource(1, 1, 2), -1);
217+
assertComparison(cluster, newResource(1, 1, 2), newResource(2, 1, 2), -1);
218+
219+
// cluster resource zero
220+
cluster = newResource(0, 0, 0);
221+
assertComparison(cluster, newResource(2, 1, 1), newResource(1, 1, 1), 1);
222+
assertComparison(cluster, newResource(2, 2, 2), newResource(1, 1, 1), 1);
223+
assertComparison(cluster, newResource(2, 1, 1), newResource(1, 2, 1), 0);
224+
assertComparison(cluster, newResource(1, 1, 1), newResource(1, 1, 1), 0);
225+
assertComparison(cluster, newResource(1, 1, 1), newResource(1, 1, 2), -1);
226+
assertComparison(cluster, newResource(1, 1, 1), newResource(1, 2, 1), -1);
227+
}
228+
206229
private void testCompareDominant(Resource cluster) {
207230
assertComparison(cluster, newResource(2, 1, 1), newResource(2, 1, 1), 0);
208231
assertComparison(cluster, newResource(2, 1, 1), newResource(1, 2, 1), 0);

0 commit comments

Comments
 (0)