Skip to content

Commit b3056c2

Browse files
committed
YARN-2685. Fixed a bug in CommonNodeLabelsManager that caused wrong resource tracking per label when a host runs multiple node-managers. Contributed by Wangda Tan.
1 parent f2ea555 commit b3056c2

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

hadoop-yarn-project/CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,10 @@ Release 2.6.0 - UNRELEASED
583583
YARN-2628. Capacity scheduler with DominantResourceCalculator carries out
584584
reservation even though slots are free. (Varun Vasudev via jianhe)
585585

586+
YARN-2685. Fixed a bug in CommonNodeLabelsManager that caused wrong resource
587+
tracking per label when a host runs multiple node-managers. (Wangda Tan via
588+
vinodkv)
589+
586590
BREAKDOWN OF YARN-1051 SUBTASKS AND RELATED JIRAS
587591

588592
YARN-1707. Introduce APIs to add/remove/resize queues in the

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public Node copy() {
129129
if (labels != null) {
130130
c.labels =
131131
Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
132+
c.labels.addAll(labels);
132133
} else {
133134
c.labels = null;
134135
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/TestRMNodeLabelsManager.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818

1919
package org.apache.hadoop.yarn.server.resourcemanager.nodelabels;
2020

21+
import java.io.IOException;
2122
import java.util.HashMap;
2223
import java.util.Map;
2324
import java.util.Set;
2425

2526
import org.apache.hadoop.conf.Configuration;
2627
import org.apache.hadoop.yarn.api.records.NodeId;
2728
import org.apache.hadoop.yarn.api.records.Resource;
29+
import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager;
2830
import org.apache.hadoop.yarn.nodelabels.NodeLabelTestBase;
2931
import org.apache.hadoop.yarn.util.resource.Resources;
3032
import org.junit.After;
@@ -364,4 +366,31 @@ public void testGetQueueResource() throws Exception {
364366
Assert.assertEquals(clusterResource,
365367
mgr.getQueueResource("Q5", q5Label, clusterResource));
366368
}
369+
370+
@Test(timeout=5000)
371+
public void testGetLabelResourceWhenMultipleNMsExistingInSameHost() throws IOException {
372+
// active two NM to n1, one large and one small
373+
mgr.activateNode(NodeId.newInstance("n1", 1), SMALL_RESOURCE);
374+
mgr.activateNode(NodeId.newInstance("n1", 2), SMALL_RESOURCE);
375+
mgr.activateNode(NodeId.newInstance("n1", 3), SMALL_RESOURCE);
376+
mgr.activateNode(NodeId.newInstance("n1", 4), SMALL_RESOURCE);
377+
378+
// check resource of no label, it should be small * 4
379+
Assert.assertEquals(
380+
mgr.getResourceByLabel(CommonNodeLabelsManager.NO_LABEL, null),
381+
Resources.multiply(SMALL_RESOURCE, 4));
382+
383+
// change two of these nodes to p1, check resource of no_label and P1
384+
mgr.addToCluserNodeLabels(toSet("p1"));
385+
mgr.addLabelsToNode(ImmutableMap.of(toNodeId("n1:1"), toSet("p1"),
386+
toNodeId("n1:2"), toSet("p1")));
387+
388+
// check resource
389+
Assert.assertEquals(
390+
mgr.getResourceByLabel(CommonNodeLabelsManager.NO_LABEL, null),
391+
Resources.multiply(SMALL_RESOURCE, 2));
392+
Assert.assertEquals(
393+
mgr.getResourceByLabel("p1", null),
394+
Resources.multiply(SMALL_RESOURCE, 2));
395+
}
367396
}

0 commit comments

Comments
 (0)