diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index f0e44e588b8..02d283c2fe8 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -98,6 +98,9 @@ Release 2.7.3 - UNRELEASED YARN-2046. Out of band heartbeats are sent only on container kill and possibly too early (Ming Ma via jlowe) + YARN-4723. NodesListManager$UnknownNodeId ClassCastException (Kuhu Shukla + via jlowe) + Release 2.7.2 - 2016-01-25 INCOMPATIBLE CHANGES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java index b153b0fab43..46fb3afbccf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java @@ -143,17 +143,8 @@ public class NodesListManager extends AbstractService implements UnknownNodeId nodeId = new UnknownNodeId(host); RMNodeImpl rmNode = new RMNodeImpl(nodeId, rmContext, host, -1, -1, new UnknownNode(host), null, null); - - RMNode prevRMNode = - rmContext.getRMNodes().putIfAbsent(nodeId, rmNode); - if (prevRMNode != null) { - this.rmContext.getDispatcher().getEventHandler().handle( - new RMNodeEvent(prevRMNode.getNodeID(), - RMNodeEventType.DECOMMISSION)); - } else { - this.rmContext.getDispatcher().getEventHandler().handle( - new RMNodeEvent(nodeId, RMNodeEventType.DECOMMISSION)); - } + rmContext.getInactiveRMNodes().put(nodeId.getHost(), rmNode); + rmNode.handle(new RMNodeEvent(nodeId, RMNodeEventType.DECOMMISSION)); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNodeImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNodeImpl.java index 673264fae29..321052472e5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNodeImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNodeImpl.java @@ -743,6 +743,11 @@ public class RMNodeImpl implements RMNode, EventHandler { @Override public void transition(RMNodeImpl rmNode, RMNodeEvent event) { + //check for UnknownNodeId + if (rmNode.getNodeID().getPort() == -1) { + rmNode.updateMetricsForDeactivatedNode(rmNode.getState(), finalState); + return; + } // Inform the scheduler rmNode.nodeUpdateQueue.clear(); // If the current state is NodeState.UNHEALTHY diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMNodeTransitions.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMNodeTransitions.java index c6da3fd1fe8..0735e0fd702 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMNodeTransitions.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMNodeTransitions.java @@ -457,6 +457,20 @@ public class TestRMNodeTransitions { Assert.assertEquals(finishedAppId, hbrsp.getApplicationsToCleanup().get(0)); } + @Test + public void testUnknownNodeId() { + NodesListManager.UnknownNodeId nodeId = + new NodesListManager.UnknownNodeId("host1"); + RMNodeImpl node = + new RMNodeImpl(nodeId, rmContext, null, 0, 0, null, null, null); + rmContext.getInactiveRMNodes().putIfAbsent(nodeId.getHost(),node); + node.handle( + new RMNodeEvent(node.getNodeID(), RMNodeEventType.DECOMMISSION)); + Assert.assertNull( + "Must be null as there is no NODE_UNUSABLE update", + nodesListManagerEvent); + } + private RMNodeImpl getRunningNode() { return getRunningNode(null); }