diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java index ee1b945..9115b44 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/nodelabels/CommonNodeLabelsManager.java @@ -120,7 +120,7 @@ public Host copy() { protected Node() { labels = null; - resource = Resource.newInstance(0, 0); + resource = Resources.none(); running = false; } @@ -266,7 +266,9 @@ public void addToCluserNodeLabels(Set labels) throws IOException { } for (String label : labels) { - this.labelCollections.put(label, new Label()); + if (this.labelCollections.get(label) == null) { + this.labelCollections.put(label, new Label()); + } } if (null != dispatcher) { dispatcher.getEventHandler().handle( @@ -454,11 +456,11 @@ protected void checkRemoveLabelsFromNode( throw new IOException(msg); } - if (labels == null || labels.isEmpty()) { + if (labels.isEmpty()) { continue; } - if (!originalLabels.containsAll(labels)) { + if (originalLabels == null || !originalLabels.containsAll(labels)) { String msg = "Try to remove labels = [" + StringUtils.join(labels, ",") + "], but not all labels contained by NM=" + nodeId; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java index ba1727c..c11ee67 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/RMNodeLabelsManager.java @@ -66,6 +66,17 @@ protected void serviceInit(Configuration conf) throws Exception { } @Override + public void addToCluserNodeLabels(Set labels) throws IOException { + try { + writeLock.lock(); + + super.addToCluserNodeLabels(labels); + } finally { + writeLock.unlock(); + } + } + + @Override public void addLabelsToNode(Map> addedLabelsToNode) throws IOException { try { @@ -216,7 +227,7 @@ public void deactivateNode(NodeId nodeId) { if (null != nm) { // set nm is not running, and its resource = 0 nm.running = false; - nm.resource = Resource.newInstance(0, 0); + nm.resource = Resources.none(); } // get the node after edition diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/TestRMNodeLabelsManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/TestRMNodeLabelsManager.java index 0ea7456..a7da94b 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/TestRMNodeLabelsManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/nodelabels/TestRMNodeLabelsManager.java @@ -74,6 +74,12 @@ public void testNodeActiveDeactiveUpdate() throws Exception { Assert.assertEquals(mgr.getResourceByLabel("p1", null), Resources.add(SMALL_RESOURCE, LARGE_NODE)); + // add label "p1" again, then check whether resource for "p1" is changed. + mgr.addToCluserNodeLabels(toSet("p1", "p4")); + Assert.assertEquals(mgr.getResourceByLabel("p1", null), + Resources.add(SMALL_RESOURCE, LARGE_NODE)); + Assert.assertEquals(mgr.getResourceByLabel("p4", null), EMPTY_RESOURCE); + // change the large NM to small, check if resource updated mgr.updateNodeResource(NodeId.newInstance("n1", 2), SMALL_RESOURCE); Assert.assertEquals(mgr.getResourceByLabel("p1", null), @@ -374,7 +380,7 @@ public void testGetQueueResource() throws Exception { Assert.assertEquals(clusterResource, mgr.getQueueResource("Q5", q5Label, clusterResource)); } - + @Test(timeout=5000) public void testGetLabelResourceWhenMultipleNMsExistingInSameHost() throws IOException { // active two NM to n1, one large and one small @@ -401,4 +407,24 @@ public void testGetLabelResourceWhenMultipleNMsExistingInSameHost() throws IOExc mgr.getResourceByLabel("p1", null), Resources.multiply(SMALL_RESOURCE, 2)); } + + @Test(timeout = 5000) + public void testRemoveLabelsFromNode() throws Exception { + mgr.addToCluserNodeLabels(toSet("p1", "p2", "p3")); + mgr.replaceLabelsOnNode(ImmutableMap.of(toNodeId("n1"), toSet("p1"), + toNodeId("n2"), toSet("p2"), toNodeId("n3"), toSet("p3"))); + // active one NM to n1:1 + mgr.activateNode(NodeId.newInstance("n1", 1), SMALL_RESOURCE); + try { + mgr.removeLabelsFromNode(ImmutableMap.of(toNodeId("n1:1"), toSet("p1"))); + Assert.fail("removeLabelsFromNode should trigger IOException"); + } catch (IOException e) { + } + mgr.replaceLabelsOnNode(ImmutableMap.of(toNodeId("n1:1"), toSet("p1"))); + try { + mgr.removeLabelsFromNode(ImmutableMap.of(toNodeId("n1:1"), toSet("p1"))); + } catch (IOException e) { + Assert.fail("IOException from removeLabelsFromNode " + e); + } + } }