diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/NodeState.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/NodeState.java index d0344fb2699..e0802806298 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/NodeState.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/NodeState.java @@ -21,6 +21,8 @@ import org.apache.hadoop.classification.InterfaceAudience.Public; import org.apache.hadoop.classification.InterfaceStability.Unstable; +import java.util.EnumSet; + /** *

State of a Node.

*/ @@ -55,4 +57,11 @@ public boolean isUnusable() { return (this == UNHEALTHY || this == DECOMMISSIONED || this == LOST || this == SHUTDOWN); } + + public static boolean isInactiveState(EnumSet nodeStates) { + return nodeStates.contains(NodeState.DECOMMISSIONED) || + nodeStates.contains(NodeState.LOST) || + nodeStates.contains(NodeState.REBOOTED) || + nodeStates.contains(NodeState.SHUTDOWN); + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMServerUtils.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMServerUtils.java index b18b12e8457..cdc1b02c01e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMServerUtils.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMServerUtils.java @@ -121,9 +121,7 @@ } // inactiveNodes contains nodes that are DECOMMISSIONED, LOST, OR REBOOTED - if (acceptedStates.contains(NodeState.DECOMMISSIONED) || - acceptedStates.contains(NodeState.LOST) || - acceptedStates.contains(NodeState.REBOOTED)) { + if (NodeState.isInactiveState(acceptedStates)) { for (RMNode rmNode : context.getInactiveRMNodes().values()) { if ((rmNode != null) && acceptedStates.contains(rmNode.getState())) { results.add(rmNode); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java index 01173768c14..a838ca4e63a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java @@ -441,9 +441,7 @@ public NodesInfo getNodes(@QueryParam(RMWSConsts.STATES) String states) { NodesInfo nodesInfo = new NodesInfo(); for (RMNode rmNode : rmNodes) { NodeInfo nodeInfo = new NodeInfo(rmNode, sched); - if (EnumSet - .of(NodeState.LOST, NodeState.DECOMMISSIONED, NodeState.REBOOTED) - .contains(rmNode.getState())) { + if (NodeState.isInactiveState(EnumSet.of(rmNode.getState()))) { nodeInfo.setNodeHTTPAddress(RMWSConsts.EMPTY); } nodesInfo.add(nodeInfo); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMServerUtils.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMServerUtils.java index c80469bfe90..9c233b9cf9e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMServerUtils.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMServerUtils.java @@ -23,16 +23,20 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest; import org.apache.hadoop.yarn.api.records.Container; import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.NodeId; +import org.apache.hadoop.yarn.api.records.NodeState; import org.apache.hadoop.yarn.api.records.Priority; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; @@ -43,11 +47,14 @@ import org.apache.hadoop.yarn.event.Dispatcher; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; +import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ContainerUpdates; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; import org.junit.Assert; import org.junit.Test; import org.mockito.Mockito; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class TestRMServerUtils { @@ -120,6 +127,37 @@ public void testValidateAndSplitUpdateResourceRequests() { Assert.assertEquals(containerIdOk, increaseRequest.getContainerId()); } + @Test + public void testQueryRMNodes() throws Exception { + RMContext rmContext = mock(RMContext.class); + NodeId node1 = NodeId.newInstance("node1", 1234); + RMNode rmNode1 = mock(RMNode.class); + ConcurrentMap inactiveList = + new ConcurrentHashMap(); + when(rmNode1.getState()).thenReturn(NodeState.SHUTDOWN); + inactiveList.put(node1, rmNode1); + when(rmContext.getInactiveRMNodes()).thenReturn(inactiveList); + List result = RMServerUtils.queryRMNodes(rmContext, + EnumSet.of(NodeState.SHUTDOWN)); + Assert.assertTrue(result.size() != 0); + Assert.assertEquals(result.get(0), rmNode1); + when(rmNode1.getState()).thenReturn(NodeState.DECOMMISSIONED); + result = RMServerUtils.queryRMNodes(rmContext, + EnumSet.of(NodeState.DECOMMISSIONED)); + Assert.assertTrue(result.size() != 0); + Assert.assertEquals(result.get(0), rmNode1); + when(rmNode1.getState()).thenReturn(NodeState.LOST); + result = RMServerUtils.queryRMNodes(rmContext, + EnumSet.of(NodeState.LOST)); + Assert.assertTrue(result.size() != 0); + Assert.assertEquals(result.get(0), rmNode1); + when(rmNode1.getState()).thenReturn(NodeState.REBOOTED); + result = RMServerUtils.queryRMNodes(rmContext, + EnumSet.of(NodeState.REBOOTED)); + Assert.assertTrue(result.size() != 0); + Assert.assertEquals(result.get(0), rmNode1); + } + @Test public void testGetApplicableNodeCountForAMLocality() throws Exception { List rack1Nodes = new ArrayList<>();