Skip to content

Commit abae63c

Browse files
committed
YARN-2699. Fixed a bug in CommonNodeLabelsManager that caused tests to fail when using ephemeral ports on NodeIDs. Contributed by Wangda Tan.
1 parent 3687431 commit abae63c

File tree

4 files changed

+40
-20
lines changed

4 files changed

+40
-20
lines changed

hadoop-yarn-project/CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,9 @@ Release 2.6.0 - UNRELEASED
594594
tracking per label when a host runs multiple node-managers. (Wangda Tan via
595595
vinodkv)
596596

597+
YARN-2699. Fixed a bug in CommonNodeLabelsManager that caused tests to fail
598+
when using ephemeral ports on NodeIDs. (Wangda Tan via vinodkv)
599+
597600
BREAKDOWN OF YARN-1051 SUBTASKS AND RELATED JIRAS
598601

599602
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: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -299,14 +299,14 @@ protected void internalAddLabelsToNode(
299299
for (Entry<NodeId, Set<String>> entry : addedLabelsToNode.entrySet()) {
300300
NodeId nodeId = entry.getKey();
301301
Set<String> labels = entry.getValue();
302-
303-
createNodeIfNonExisted(entry.getKey());
304-
302+
303+
createHostIfNonExisted(nodeId.getHost());
305304
if (nodeId.getPort() == WILDCARD_PORT) {
306305
Host host = nodeCollections.get(nodeId.getHost());
307306
host.labels.addAll(labels);
308307
newNMToLabels.put(nodeId, host.labels);
309308
} else {
309+
createNodeIfNonExisted(nodeId);
310310
Node nm = getNMInNodeSet(nodeId);
311311
if (nm.labels == null) {
312312
nm.labels = new HashSet<String>();
@@ -534,21 +534,21 @@ protected void checkReplaceLabelsOnNode(
534534

535535
@SuppressWarnings("unchecked")
536536
protected void internalReplaceLabelsOnNode(
537-
Map<NodeId, Set<String>> replaceLabelsToNode) {
537+
Map<NodeId, Set<String>> replaceLabelsToNode) throws IOException {
538538
// do replace labels to nodes
539539
Map<NodeId, Set<String>> newNMToLabels = new HashMap<NodeId, Set<String>>();
540540
for (Entry<NodeId, Set<String>> entry : replaceLabelsToNode.entrySet()) {
541541
NodeId nodeId = entry.getKey();
542542
Set<String> labels = entry.getValue();
543543

544-
// update nodeCollections
545-
createNodeIfNonExisted(entry.getKey());
544+
createHostIfNonExisted(nodeId.getHost());
546545
if (nodeId.getPort() == WILDCARD_PORT) {
547546
Host host = nodeCollections.get(nodeId.getHost());
548547
host.labels.clear();
549548
host.labels.addAll(labels);
550549
newNMToLabels.put(nodeId, host.labels);
551550
} else {
551+
createNodeIfNonExisted(nodeId);
552552
Node nm = getNMInNodeSet(nodeId);
553553
if (nm.labels == null) {
554554
nm.labels = new HashSet<String>();
@@ -672,10 +672,6 @@ protected Node getNMInNodeSet(NodeId nodeId, Map<String, Host> map) {
672672

673673
protected Node getNMInNodeSet(NodeId nodeId, Map<String, Host> map,
674674
boolean checkRunning) {
675-
if (WILDCARD_PORT == nodeId.getPort()) {
676-
return null;
677-
}
678-
679675
Host host = map.get(nodeId.getHost());
680676
if (null == host) {
681677
return null;
@@ -707,17 +703,22 @@ protected Set<String> getLabelsByNode(NodeId nodeId, Map<String, Host> map) {
707703
}
708704
}
709705

710-
protected void createNodeIfNonExisted(NodeId nodeId) {
706+
protected void createNodeIfNonExisted(NodeId nodeId) throws IOException {
711707
Host host = nodeCollections.get(nodeId.getHost());
712708
if (null == host) {
713-
host = new Host();
714-
nodeCollections.put(nodeId.getHost(), host);
709+
throw new IOException("Should create host before creating node.");
715710
}
716-
if (nodeId.getPort() != WILDCARD_PORT) {
717-
Node nm = host.nms.get(nodeId);
718-
if (null == nm) {
719-
host.nms.put(nodeId, new Node());
720-
}
711+
Node nm = host.nms.get(nodeId);
712+
if (null == nm) {
713+
host.nms.put(nodeId, new Node());
714+
}
715+
}
716+
717+
protected void createHostIfNonExisted(String hostName) {
718+
Host host = nodeCollections.get(hostName);
719+
if (null == host) {
720+
host = new Host();
721+
nodeCollections.put(hostName, host);
721722
}
722723
}
723724
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,15 @@ public void activateNode(NodeId nodeId, Resource resource) {
181181
// save if we have a node before
182182
Map<String, Host> before = cloneNodeMap(ImmutableSet.of(nodeId));
183183

184-
createNodeIfNonExisted(nodeId);
184+
createHostIfNonExisted(nodeId.getHost());
185+
try {
186+
createNodeIfNonExisted(nodeId);
187+
} catch (IOException e) {
188+
LOG.error("This shouldn't happen, cannot get host in nodeCollection"
189+
+ " associated to the node being activated");
190+
return;
191+
}
192+
185193
Node nm = getNMInNodeSet(nodeId);
186194
nm.resource = resource;
187195
nm.running = true;
@@ -220,7 +228,7 @@ public void deactivateNode(NodeId nodeId) {
220228
}
221229
}
222230

223-
public void updateNodeResource(NodeId node, Resource newResource) {
231+
public void updateNodeResource(NodeId node, Resource newResource) throws IOException {
224232
deactivateNode(node);
225233
activateNode(node, newResource);
226234
}

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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ public void testNodeActiveDeactiveUpdate() throws Exception {
9696
Assert.assertEquals(mgr.getResourceByLabel(RMNodeLabelsManager.NO_LABEL, null),
9797
Resources.add(SMALL_RESOURCE, LARGE_NODE));
9898
}
99+
100+
@Test(timeout = 5000)
101+
public void testActivateNodeManagerWithZeroPort() throws Exception {
102+
// active two NM, one is zero port , another is non-zero port. no exception
103+
// should be raised
104+
mgr.activateNode(NodeId.newInstance("n1", 0), SMALL_RESOURCE);
105+
mgr.activateNode(NodeId.newInstance("n1", 2), LARGE_NODE);
106+
}
99107

100108
@SuppressWarnings({ "unchecked", "rawtypes" })
101109
@Test(timeout = 5000)

0 commit comments

Comments
 (0)