diff --git a/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/nodemanager/NodeInfo.java b/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/nodemanager/NodeInfo.java index 951f5a850df..43ff18854be 100644 --- a/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/nodemanager/NodeInfo.java +++ b/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/nodemanager/NodeInfo.java @@ -131,15 +131,15 @@ public NodeState getState() { return state; } - public List getContainersToCleanUp() { + public Set getContainersToCleanUp() { return toCleanUpContainers; } - public List getAppsToCleanup() { + public Set getAppsToCleanup() { return toCleanUpApplications; } - public List getRunningApps() { + public Set getRunningApps() { return runningApplications; } diff --git a/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/scheduler/RMNodeWrapper.java b/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/scheduler/RMNodeWrapper.java index e5013c43d75..32051dddec9 100644 --- a/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/scheduler/RMNodeWrapper.java +++ b/hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/scheduler/RMNodeWrapper.java @@ -111,17 +111,17 @@ public NodeState getState() { } @Override - public List getContainersToCleanUp() { + public Set getContainersToCleanUp() { return node.getContainersToCleanUp(); } @Override - public List getAppsToCleanup() { + public Set getAppsToCleanup() { return node.getAppsToCleanup(); } @Override - public List getRunningApps() { + public Set getRunningApps() { return node.getRunningApps(); } 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/RMNode.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNode.java index 48df1e836b0..c7ae39cc70a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNode.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNode.java @@ -126,11 +126,11 @@ public NodeState getState(); - public List getContainersToCleanUp(); + public Set getContainersToCleanUp(); - public List getAppsToCleanup(); + public Set getAppsToCleanup(); - List getRunningApps(); + Set getRunningApps(); /** * Update a {@link NodeHeartbeatResponse} with the list of containers and 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 830a6a906f4..4e60eeaab6b 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 @@ -114,8 +114,6 @@ private int httpPort; private final String nodeAddress; // The containerManager address private String httpAddress; - /* Snapshot of total resources before receiving decommissioning command */ - private volatile Resource originalTotalCapability; private volatile Resource totalCapability; private final Node node; @@ -150,12 +148,12 @@ new HashSet(); /* the list of applications that have finished and need to be purged */ - private final List finishedApplications = - new ArrayList(); + private final Set finishedApplications = + new HashSet<>(); /* the list of applications that are running on this node */ - private final List runningApplications = - new ArrayList(); + private final Set runningApplications = + new HashSet(); private final Map toBeDecreasedContainers = new HashMap<>(); @@ -525,11 +523,11 @@ public NodeState getState() { } @Override - public List getAppsToCleanup() { + public Set getAppsToCleanup() { this.readLock.lock(); try { - return new ArrayList(this.finishedApplications); + return new HashSet(this.finishedApplications); } finally { this.readLock.unlock(); } @@ -537,22 +535,22 @@ public NodeState getState() { } @Override - public List getRunningApps() { + public Set getRunningApps() { this.readLock.lock(); try { - return new ArrayList(this.runningApplications); + return new HashSet(this.runningApplications); } finally { this.readLock.unlock(); } } @Override - public List getContainersToCleanUp() { + public Set getContainersToCleanUp() { this.readLock.lock(); try { - return new ArrayList(this.containersToClean); + return new HashSet(this.containersToClean); } finally { this.readLock.unlock(); } @@ -565,7 +563,7 @@ public void updateNodeHeartbeatResponseForCleanup(NodeHeartbeatResponse response try { response.addAllContainersToCleanup( new ArrayList(this.containersToClean)); - response.addAllApplicationsToCleanup(this.finishedApplications); + response.addAllApplicationsToCleanup(new ArrayList<>(this.finishedApplications)); response.addContainersToBeRemovedFromNM( new ArrayList(this.containersToBeRemovedFromNM)); response.addAllContainersToSignal(this.containersToSignal); @@ -1071,12 +1069,6 @@ public void transition(RMNodeImpl rmNode, RMNodeEvent event) { LOG.info("Put Node " + rmNode.nodeId + " in DECOMMISSIONING."); // Update NM metrics during graceful decommissioning. rmNode.updateMetricsForGracefulDecommission(initState, finalState); - if (rmNode.originalTotalCapability == null){ - rmNode.originalTotalCapability = - Resources.clone(rmNode.totalCapability); - LOG.info("Preserve original total capability: " - + rmNode.originalTotalCapability); - } } } @@ -1090,22 +1082,10 @@ public RecommissionNodeTransition(NodeState finalState) { @Override public void transition(RMNodeImpl rmNode, RMNodeEvent event) { - // Restore the original total capability - if (rmNode.originalTotalCapability != null) { - rmNode.totalCapability = rmNode.originalTotalCapability; - rmNode.originalTotalCapability = null; - } LOG.info("Node " + rmNode.nodeId + " in DECOMMISSIONING is " + "recommissioned back to RUNNING."); rmNode .updateMetricsForGracefulDecommission(rmNode.getState(), finalState); - //update the scheduler with the restored original total capability - rmNode.context - .getDispatcher() - .getEventHandler() - .handle( - new NodeResourceUpdateSchedulerEvent(rmNode, ResourceOption - .newInstance(rmNode.totalCapability, 0))); } } @@ -1418,10 +1398,6 @@ private void handleLogAggregationStatus( } } - public Resource getOriginalTotalCapability() { - return this.originalTotalCapability; - } - @Override public long getUntrackedTimeStamp() { return this.timeStamp; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java index f0a4eb10cb6..5200274b739 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AbstractYarnScheduler.java @@ -188,7 +188,7 @@ public void serviceInit(Configuration conf) throws Exception { public void addBlacklistedNodeIdsToList(SchedulerApplicationAttempt app, List blacklistNodeIdList) { for (Map.Entry nodeEntry : nodes.entrySet()) { - if (SchedulerAppUtils.isPlaceBlacklisted(app, nodeEntry.getValue(), + if (!SchedulerAppUtils.canScheduleOnNode(app, nodeEntry.getValue(), LOG)) { blacklistNodeIdList.add(nodeEntry.getKey()); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerAppUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerAppUtils.java index 631da6790c9..6a7c4e8d494 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerAppUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerAppUtils.java @@ -19,10 +19,12 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler; import org.apache.commons.logging.Log; +import org.apache.hadoop.yarn.api.records.NodeState; +import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; public class SchedulerAppUtils { - public static boolean isPlaceBlacklisted( + public static boolean canScheduleOnNode( SchedulerApplicationAttempt application, SchedulerNode node, Log log) { if (application.isPlaceBlacklisted(node.getNodeName())) { if (log.isDebugEnabled()) { @@ -30,7 +32,7 @@ public static boolean isPlaceBlacklisted( " for " + application.getApplicationId() + " since it has been blacklisted"); } - return true; + return false; } if (application.isPlaceBlacklisted(node.getRackName())) { @@ -39,10 +41,22 @@ public static boolean isPlaceBlacklisted( " for " + application.getApplicationId() + " since it has been blacklisted"); } - return true; + return false; } - return false; + RMNode rmNode = node.getRMNode(); + if (rmNode.getState() == NodeState.DECOMMISSIONING && + !rmNode.getRunningApps().contains(application.getApplicationId())) { + if (log.isDebugEnabled()) { + log.debug("Skipping 'host' " + node.getNodeName() + + " for " + application.getApplicationId() + + " since the node is decommissioning and the application did not have containers run" + + " on the node before it started decommissioning."); + } + return false; + } + + return true; } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java index 95323dbf0b4..cebb60b3c4f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java @@ -1088,20 +1088,6 @@ private synchronized void nodeUpdate(RMNode nm) { } } - // If the node is decommissioning, send an update to have the total - // resource equal to the used resource, so no available resource to - // schedule. - // TODO: Fix possible race-condition when request comes in before - // update is propagated - if (nm.getState() == NodeState.DECOMMISSIONING) { - this.rmContext - .getDispatcher() - .getEventHandler() - .handle( - new RMNodeResourceUpdateEvent(nm.getNodeID(), ResourceOption - .newInstance(getSchedulerNode(nm.getNodeID()) - .getUsedResource(), 0))); - } schedulerHealth.updateSchedulerReleaseDetails(lastNodeUpdateTime, releaseResources); schedulerHealth.updateSchedulerReleaseCounts(releasedContainers); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/allocator/RegularContainerAllocator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/allocator/RegularContainerAllocator.java index 119a7325138..4f3fadf3e0e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/allocator/RegularContainerAllocator.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/allocator/RegularContainerAllocator.java @@ -82,7 +82,7 @@ private boolean checkHeadroom(Resource clusterResource, private ContainerAllocation preCheckForNewContainer(Resource clusterResource, FiCaSchedulerNode node, SchedulingMode schedulingMode, ResourceLimits resourceLimits, Priority priority) { - if (SchedulerAppUtils.isPlaceBlacklisted(application, node, LOG)) { + if (!SchedulerAppUtils.canScheduleOnNode(application, node, LOG)) { application.updateAppSkipNodeDiagnostics( CSAMContainerLaunchDiagnosticsConstants.SKIP_AM_ALLOCATION_IN_BLACK_LISTED_NODE); return ContainerAllocation.APP_SKIPPED; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java index 87a5448a9d7..5985321f68b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSLeafQueue.java @@ -331,7 +331,7 @@ public Resource assignContainer(FSSchedulerNode node) { readLock.unlock(); } for (FSAppAttempt sched : pendingForResourceApps) { - if (SchedulerAppUtils.isPlaceBlacklisted(sched, node, LOG)) { + if (!SchedulerAppUtils.canScheduleOnNode(sched, node, LOG)) { continue; } assigned = sched.assignContainer(node); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java index 8e7d299a4e3..35049e6a4bf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java @@ -1056,19 +1056,6 @@ private synchronized void nodeUpdate(RMNode nm) { node.releaseContainer(containerId, true); } - // If the node is decommissioning, send an update to have the total - // resource equal to the used resource, so no available resource to - // schedule. - if (nm.getState() == NodeState.DECOMMISSIONING) { - this.rmContext - .getDispatcher() - .getEventHandler() - .handle( - new RMNodeResourceUpdateEvent(nm.getNodeID(), ResourceOption - .newInstance(getSchedulerNode(nm.getNodeID()) - .getUsedResource(), 0))); - } - if (continuousSchedulingEnabled) { if (!completedContainers.isEmpty()) { attemptScheduling(node); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java index 290271da7c9..bb679e1a0db 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java @@ -42,14 +42,12 @@ import org.apache.hadoop.yarn.api.records.ContainerId; import org.apache.hadoop.yarn.api.records.ContainerStatus; 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.QueueACL; import org.apache.hadoop.yarn.api.records.QueueInfo; import org.apache.hadoop.yarn.api.records.QueueState; import org.apache.hadoop.yarn.api.records.QueueUserACLInfo; import org.apache.hadoop.yarn.api.records.Resource; -import org.apache.hadoop.yarn.api.records.ResourceOption; import org.apache.hadoop.yarn.api.records.ResourceRequest; import org.apache.hadoop.yarn.api.records.UpdateContainerRequest; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -69,7 +67,6 @@ import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerEventType; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerState; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; -import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeResourceUpdateEvent; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.UpdatedContainerInfo; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ActiveUsersManager; @@ -508,7 +505,7 @@ private void assignContainers(FiCaSchedulerNode node) { application.showRequests(); synchronized (application) { // Check if this resource is on the blacklist - if (SchedulerAppUtils.isPlaceBlacklisted(application, node, LOG)) { + if (!SchedulerAppUtils.canScheduleOnNode(application, node, LOG)) { continue; } @@ -754,19 +751,6 @@ private synchronized void nodeUpdate(RMNode rmNode) { rmNode.getAggregatedContainersUtilization()); node.setNodeUtilization(rmNode.getNodeUtilization()); - // If the node is decommissioning, send an update to have the total - // resource equal to the used resource, so no available resource to - // schedule. - if (rmNode.getState() == NodeState.DECOMMISSIONING) { - this.rmContext - .getDispatcher() - .getEventHandler() - .handle( - new RMNodeResourceUpdateEvent(rmNode.getNodeID(), ResourceOption - .newInstance(getSchedulerNode(rmNode.getNodeID()) - .getUsedResource(), 0))); - } - if (rmContext.isWorkPreservingRecoveryEnabled() && !rmContext.isSchedulerReadyForAllocatingContainers()) { return; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java index 83e901db943..711b4f17f11 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockNodes.java @@ -35,7 +35,6 @@ import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager; import org.apache.hadoop.yarn.server.api.protocolrecords.NodeHeartbeatResponse; -import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.UpdatedContainerInfo; @@ -185,17 +184,17 @@ public NodeState getState() { } @Override - public List getContainersToCleanUp() { + public Set getContainersToCleanUp() { return null; } @Override - public List getAppsToCleanup() { + public Set getAppsToCleanup() { return null; } @Override - public List getRunningApps() { + public Set getRunningApps() { return null; } 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 5a462ea6fc5..d32b2399cef 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 @@ -1000,40 +1000,6 @@ public void testContainerExpire() throws Exception { verify(mockExpirer).unregister(expirationInfo2); } - @Test - public void testResourceUpdateOnDecommissioningNode() { - RMNodeImpl node = getDecommissioningNode(); - Resource oldCapacity = node.getTotalCapability(); - assertEquals("Memory resource is not match.", oldCapacity.getMemorySize(), 4096); - assertEquals("CPU resource is not match.", oldCapacity.getVirtualCores(), 4); - node.handle(new RMNodeResourceUpdateEvent(node.getNodeID(), - ResourceOption.newInstance(Resource.newInstance(2048, 2), - ResourceOption.OVER_COMMIT_TIMEOUT_MILLIS_DEFAULT))); - Resource originalCapacity = node.getOriginalTotalCapability(); - assertEquals("Memory resource is not match.", originalCapacity.getMemorySize(), oldCapacity.getMemorySize()); - assertEquals("CPU resource is not match.", originalCapacity.getVirtualCores(), oldCapacity.getVirtualCores()); - Resource newCapacity = node.getTotalCapability(); - assertEquals("Memory resource is not match.", newCapacity.getMemorySize(), 2048); - assertEquals("CPU resource is not match.", newCapacity.getVirtualCores(), 2); - - Assert.assertEquals(NodeState.DECOMMISSIONING, node.getState()); - Assert.assertNotNull(nodesListManagerEvent); - Assert.assertEquals(NodesListManagerEventType.NODE_USABLE, - nodesListManagerEvent.getType()); - } - - @Test - public void testResourceUpdateOnRecommissioningNode() { - RMNodeImpl node = getDecommissioningNode(); - Resource oldCapacity = node.getTotalCapability(); - assertEquals("Memory resource is not match.", oldCapacity.getMemorySize(), 4096); - assertEquals("CPU resource is not match.", oldCapacity.getVirtualCores(), 4); - node.handle(new RMNodeEvent(node.getNodeID(), - RMNodeEventType.RECOMMISSION)); - Resource originalCapacity = node.getOriginalTotalCapability(); - assertEquals("Original total capability not null after recommission", null, originalCapacity); - } - @Test public void testDisappearingContainer() { ContainerId cid1 = BuilderUtils.newContainerId( diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java index e7eb788e286..6fc8b687822 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java @@ -3375,93 +3375,6 @@ private void sentRMContainerLaunched(MockRM rm, ContainerId containerId) { } } - @Test - public void testResourceUpdateDecommissioningNode() throws Exception { - // Mock the RMNodeResourceUpdate event handler to update SchedulerNode - // to have 0 available resource - RMContext spyContext = Mockito.spy(resourceManager.getRMContext()); - Dispatcher mockDispatcher = mock(AsyncDispatcher.class); - when(mockDispatcher.getEventHandler()).thenReturn(new EventHandler() { - @Override - public void handle(Event event) { - if (event instanceof RMNodeResourceUpdateEvent) { - RMNodeResourceUpdateEvent resourceEvent = - (RMNodeResourceUpdateEvent) event; - resourceManager - .getResourceScheduler() - .getSchedulerNode(resourceEvent.getNodeId()) - .updateTotalResource(resourceEvent.getResourceOption().getResource()); - } - } - }); - Mockito.doReturn(mockDispatcher).when(spyContext).getDispatcher(); - ((CapacityScheduler) resourceManager.getResourceScheduler()) - .setRMContext(spyContext); - ((AsyncDispatcher) mockDispatcher).start(); - // Register node - String host_0 = "host_0"; - org.apache.hadoop.yarn.server.resourcemanager.NodeManager nm_0 = - registerNode(host_0, 1234, 2345, NetworkTopology.DEFAULT_RACK, - Resources.createResource(8 * GB, 4)); - // ResourceRequest priorities - Priority priority_0 = - org.apache.hadoop.yarn.server.resourcemanager.resource.Priority - .create(0); - - // Submit an application - Application application_0 = - new Application("user_0", "a1", resourceManager); - application_0.submit(); - - application_0.addNodeManager(host_0, 1234, nm_0); - - Resource capability_0_0 = Resources.createResource(1 * GB, 1); - application_0.addResourceRequestSpec(priority_0, capability_0_0); - - Task task_0_0 = - new Task(application_0, priority_0, new String[] { host_0 }); - application_0.addTask(task_0_0); - - // Send resource requests to the scheduler - application_0.schedule(); - - nodeUpdate(nm_0); - // Kick off another heartbeat with the node state mocked to decommissioning - // This should update the schedulernodes to have 0 available resource - RMNode spyNode = - Mockito.spy(resourceManager.getRMContext().getRMNodes() - .get(nm_0.getNodeId())); - when(spyNode.getState()).thenReturn(NodeState.DECOMMISSIONING); - resourceManager.getResourceScheduler().handle( - new NodeUpdateSchedulerEvent(spyNode)); - - // Get allocations from the scheduler - application_0.schedule(); - - // Check the used resource is 1 GB 1 core - Assert.assertEquals(1 * GB, nm_0.getUsed().getMemorySize()); - Resource usedResource = - resourceManager.getResourceScheduler() - - .getSchedulerNode(nm_0.getNodeId()).getUsedResource(); - Assert.assertEquals(usedResource.getMemorySize(), 1 * GB); - - Assert.assertEquals(usedResource.getVirtualCores(), 1); - // Check total resource of scheduler node is also changed to 1 GB 1 core - Resource totalResource = - resourceManager.getResourceScheduler() - .getSchedulerNode(nm_0.getNodeId()).getTotalResource(); - Assert.assertEquals(totalResource.getMemorySize(), 1 * GB); - Assert.assertEquals(totalResource.getVirtualCores(), 1); - // Check the available resource is 0/0 - Resource availableResource = - resourceManager.getResourceScheduler() - .getSchedulerNode(nm_0.getNodeId()).getAvailableResource(); - Assert.assertEquals(availableResource.getMemorySize(), 0); - - Assert.assertEquals(availableResource.getVirtualCores(), 0); - } - @Test public void testCSReservationWithRootUnblocked() throws Exception { CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java index aedcc3ef638..00505fc4e75 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java @@ -5295,72 +5295,6 @@ public void testFairSchedulerContinuousSchedulingInitTime() throws Exception { assertEquals(DELAY_THRESHOLD_TIME_MS, initSchedulerTime); } - @Test - public void testResourceUpdateDecommissioningNode() throws Exception { - // Mock the RMNodeResourceUpdate event handler to update SchedulerNode - // to have 0 available resource - RMContext spyContext = Mockito.spy(resourceManager.getRMContext()); - Dispatcher mockDispatcher = mock(AsyncDispatcher.class); - when(mockDispatcher.getEventHandler()).thenReturn(new EventHandler() { - @Override - public void handle(Event event) { - if (event instanceof RMNodeResourceUpdateEvent) { - RMNodeResourceUpdateEvent resourceEvent = - (RMNodeResourceUpdateEvent) event; - resourceManager - .getResourceScheduler() - .getSchedulerNode(resourceEvent.getNodeId()) - .updateTotalResource(resourceEvent.getResourceOption().getResource()); - } - } - }); - Mockito.doReturn(mockDispatcher).when(spyContext).getDispatcher(); - ((FairScheduler) resourceManager.getResourceScheduler()) - .setRMContext(spyContext); - ((AsyncDispatcher) mockDispatcher).start(); - // Register node - String host_0 = "host_0"; - org.apache.hadoop.yarn.server.resourcemanager.NodeManager nm_0 = - registerNode(host_0, 1234, 2345, NetworkTopology.DEFAULT_RACK, - Resources.createResource(8 * GB, 4)); - - RMNode node = - resourceManager.getRMContext().getRMNodes().get(nm_0.getNodeId()); - // Send a heartbeat to kick the tires on the Scheduler - NodeUpdateSchedulerEvent nodeUpdate = new NodeUpdateSchedulerEvent(node); - resourceManager.getResourceScheduler().handle(nodeUpdate); - - // Kick off another heartbeat with the node state mocked to decommissioning - // This should update the schedulernodes to have 0 available resource - RMNode spyNode = - Mockito.spy(resourceManager.getRMContext().getRMNodes() - .get(nm_0.getNodeId())); - when(spyNode.getState()).thenReturn(NodeState.DECOMMISSIONING); - resourceManager.getResourceScheduler().handle( - new NodeUpdateSchedulerEvent(spyNode)); - - // Check the used resource is 0 GB 0 core - // Assert.assertEquals(1 * GB, nm_0.getUsed().getMemorySize()); - Resource usedResource = - resourceManager.getResourceScheduler() - .getSchedulerNode(nm_0.getNodeId()).getUsedResource(); - Assert.assertEquals(usedResource.getMemorySize(), 0); - - Assert.assertEquals(usedResource.getVirtualCores(), 0); - // Check total resource of scheduler node is also changed to 0 GB 0 core - Resource totalResource = - resourceManager.getResourceScheduler() - .getSchedulerNode(nm_0.getNodeId()).getTotalResource(); - Assert.assertEquals(totalResource.getMemorySize(), 0 * GB); - Assert.assertEquals(totalResource.getVirtualCores(), 0); - // Check the available resource is 0/0 - Resource availableResource = - resourceManager.getResourceScheduler() - .getSchedulerNode(nm_0.getNodeId()).getAvailableResource(); - Assert.assertEquals(availableResource.getMemorySize(), 0); - Assert.assertEquals(availableResource.getVirtualCores(), 0); - } - private org.apache.hadoop.yarn.server.resourcemanager.NodeManager registerNode( String hostName, int containerManagerPort, int httpPort, String rackName, Resource capability) throws IOException, YarnException {