diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java index e6251fe..4cdf67a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java @@ -400,8 +400,7 @@ public void refreshNodesGracefully(Configuration conf) throws IOException, new RMNodeEvent(nodeId, RMNodeEventType.GRACEFUL_DECOMMISSION)); } else { // Recommissioning the nodes - if (entry.getValue().getState() == NodeState.DECOMMISSIONING - || entry.getValue().getState() == NodeState.DECOMMISSIONED) { + if (entry.getValue().getState() == NodeState.DECOMMISSIONING) { this.rmContext.getDispatcher().getEventHandler() .handle(new RMNodeEvent(nodeId, RMNodeEventType.RECOMMISSION)); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java index e0fd9ab..9ed79a3 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java @@ -1269,6 +1269,41 @@ public void testInitDecommMetricNoRegistration() throws Exception { rm1.stop(); } + @Test + public void testIncorrectRecommission() throws Exception { + //Check decommissioned node not get recommissioned with graceful refresh + Configuration conf = new Configuration(); + rm = new MockRM(conf); + rm.start(); + MockNM nm1 = rm.registerNode("host1:1234", 5120); + MockNM nm2 = rm.registerNode("host2:5678", 10240); + nm1.nodeHeartbeat(true); + nm2.nodeHeartbeat(true); + File excludeHostFile = + new File(TEMP_DIR + File.separator + "excludeHostFile.txt"); + writeToHostsFile(excludeHostFile, "host3", "host2"); + conf.set(YarnConfiguration.RM_NODES_EXCLUDE_FILE_PATH, + excludeHostFile.getAbsolutePath()); + writeToHostsFile(hostFile, "host1", "host2"); + writeToHostsFile(excludeHostFile, "host1"); + rm.getNodesListManager().refreshNodesGracefully(conf); + rm.drainEvents(); + nm1.nodeHeartbeat(true); + rm.drainEvents(); + Assert.assertTrue("Node " + nm1.getNodeId().getHost() + + " should be Decommissioned", rm.getRMContext() + .getInactiveRMNodes().get(nm1.getNodeId()).getState() == NodeState + .DECOMMISSIONED); + writeToHostsFile(excludeHostFile, ""); + rm.getNodesListManager().refreshNodesGracefully(conf); + rm.drainEvents(); + Assert.assertTrue("Node " + nm1.getNodeId().getHost() + + " should be Decommissioned", rm.getRMContext() + .getInactiveRMNodes().get(nm1.getNodeId()).getState() == NodeState + .DECOMMISSIONED); + rm.stop(); + } + private void writeToHostsFile(String... hosts) throws IOException { writeToHostsFile(hostFile, hosts); }