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 000f59c..fb380c5 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 @@ -1035,6 +1035,7 @@ public Allocation allocate(ApplicationAttemptId applicationAttemptId, releaseContainers(release, application); LeafQueue updateDemandForQueue = null; + ParentQueue updateDemandForParentQueue = null; // Sanity check for new allocation requests normalizeRequests(ask); @@ -1061,6 +1062,8 @@ public Allocation allocate(ApplicationAttemptId applicationAttemptId, // Update application requests if (application.updateResourceRequests(ask)) { updateDemandForQueue = (LeafQueue) application.getQueue(); + updateDemandForParentQueue = + (ParentQueue) updateDemandForQueue.getParent(); } if (LOG.isDebugEnabled()) { @@ -1081,6 +1084,9 @@ public Allocation allocate(ApplicationAttemptId applicationAttemptId, .isWaitingForAMContainer()) { updateDemandForQueue.getOrderingPolicy().demandUpdated(application); } + if (updateDemandForParentQueue != null) { + updateDemandForParentQueue.demandUpdated(updateDemandForQueue); + } return allocation; } @@ -2188,6 +2194,8 @@ public String moveApplication(ApplicationId appId, // Detach the application.. source.getParent().finishApplication(appId, user); application.setQueue(dest); + // Update demand for new parent queue + ((ParentQueue)dest.getParent()).demandUpdated(dest); LOG.info("App: " + appId + " successfully moved from " + sourceQueueName + " to: " + destQueueName); return targetQueueName; 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/ParentQueue.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/ParentQueue.java index c198d13..ec1ad38 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/ParentQueue.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/ParentQueue.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -144,7 +145,6 @@ protected void setupQueueConfigs(Resource clusterResource) getQueuePath(), parent == null ? null : ((ParentQueue) parent).getQueueOrderingPolicyConfigName()); - queueOrderingPolicy.setQueues(childQueues); LOG.info(queueName + ", capacity=" + this.queueCapacities.getCapacity() + ", absoluteCapacity=" + this.queueCapacities.getAbsoluteCapacity() @@ -410,7 +410,11 @@ public void reinitialize(CSQueue newlyParsedQueue, childQueues.addAll(currentChildQueues.values()); // Make sure we notifies QueueOrderingPolicy - queueOrderingPolicy.setQueues(childQueues); + List pendingChildQueues = childQueues.stream() + .filter(e -> !Resources.equals(e.getQueueResourceUsage() + .getAllPending(), Resources.none())) + .collect(Collectors.toList()); + queueOrderingPolicy.setQueues(pendingChildQueues); } finally { writeLock.unlock(); } @@ -1354,4 +1358,12 @@ public void stopQueue() { public QueueOrderingPolicy getQueueOrderingPolicy() { return queueOrderingPolicy; } + + public void demandUpdated(CSQueue queue) { + queueOrderingPolicy.demandUpdated(queue); + // Inform the parent + if (parent != null) { + ((ParentQueue) parent).demandUpdated(this); + } + } } 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/policy/PriorityUtilizationQueueOrderingPolicy.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/policy/PriorityUtilizationQueueOrderingPolicy.java index e684c2b..6d01c0d 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/policy/PriorityUtilizationQueueOrderingPolicy.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/policy/PriorityUtilizationQueueOrderingPolicy.java @@ -31,9 +31,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.function.Supplier; +import java.util.stream.Collectors; /** * For two queues with the same priority: @@ -54,6 +57,7 @@ public class PriorityUtilizationQueueOrderingPolicy implements QueueOrderingPolicy { private List queues; + private Map demandQueues = new HashMap<>(); private boolean respectPriority; // This makes multiple threads can sort queues at the same time @@ -208,8 +212,13 @@ public PriorityUtilizationQueueOrderingPolicy(boolean respectPriority) { } @Override + @VisibleForTesting public void setQueues(List queues) { - this.queues = queues; + synchronized (demandQueues) { + demandQueues.clear(); + queues.stream().forEach(e -> demandQueues.put(e.getQueueName(), e)); + this.queues = new ArrayList<>(demandQueues.values()); + } } @Override @@ -217,9 +226,19 @@ public void setQueues(List queues) { // Since partitionToLookAt is a thread local variable, and every time we // copy and sort queues, so it's safe for multi-threading environment. PriorityUtilizationQueueOrderingPolicy.partitionToLookAt.set(partition); - List sortedQueue = new ArrayList<>(queues); - Collections.sort(sortedQueue, new PriorityQueueComparator()); - return sortedQueue.iterator(); + if (queues == null || demandQueues.size() != queues.size()) { + synchronized (demandQueues) { + demandQueues = demandQueues.entrySet().stream() + .filter(e -> !Resources.equals(e.getValue().getQueueResourceUsage() + .getAllPending(), Resources.none())) + .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); + queues = new ArrayList<>(demandQueues.values()); + } + } + if (queues.size() > 1) { + Collections.sort(queues, new PriorityQueueComparator()); + } + return queues.iterator(); } @Override @@ -235,6 +254,17 @@ public String getConfigName() { @VisibleForTesting public List getQueues() { - return queues; + synchronized (demandQueues) { + return new ArrayList<>(demandQueues.values()); + } + } + + @Override + public void demandUpdated(CSQueue queue) { + synchronized (demandQueues) { + if (!demandQueues.containsKey(queue.getQueueName())) { + demandQueues.put(queue.getQueueName(), queue); + } + } } } 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/policy/QueueOrderingPolicy.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/policy/QueueOrderingPolicy.java index a434ab0..4ca932a 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/policy/QueueOrderingPolicy.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/policy/QueueOrderingPolicy.java @@ -49,4 +49,12 @@ * @return configuration name */ String getConfigName(); + + /** + * Notify the {@code QueueOrderingPolicy} that the demand for the + * {@link CSQueue} has been updated, enabling the + * {@code QueueOrderingPolicy} to reorder the child queues if needed. + * @param queue the updated child queue + */ + void demandUpdated(CSQueue queue); } 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 e91f734..ef7b68e 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 @@ -3837,6 +3837,8 @@ public void testHeadRoomCalculationWithDRC() throws Exception { fiCaApp1.updateResourceRequests(Collections.singletonList( TestUtils.createResourceRequest(ResourceRequest.ANY, 10*GB, 1, true, u0Priority, recordFactory))); + ((ParentQueue) ((LeafQueue) fiCaApp1.getQueue()).getParent()) + .demandUpdated((CSQueue) fiCaApp1.getQueue()); cs.handle(new NodeUpdateSchedulerEvent(node)); cs.handle(new NodeUpdateSchedulerEvent(node2)); assertEquals(6*GB, fiCaApp1.getHeadroom().getMemorySize()); @@ -3846,6 +3848,8 @@ public void testHeadRoomCalculationWithDRC() throws Exception { fiCaApp2.updateResourceRequests(Collections.singletonList( TestUtils.createResourceRequest(ResourceRequest.ANY, 1*GB, 1, true, u0Priority, recordFactory))); + ((ParentQueue) ((LeafQueue) fiCaApp2.getQueue()).getParent()) + .demandUpdated((CSQueue) fiCaApp2.getQueue()); cs.handle(new NodeUpdateSchedulerEvent(node)); cs.handle(new NodeUpdateSchedulerEvent(node2)); assertEquals(9*GB, fiCaApp2.getHeadroom().getMemorySize()); 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/TestCapacitySchedulerPerf.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/TestCapacitySchedulerPerf.java index a2ccf6e..529ab0c 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/TestCapacitySchedulerPerf.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/TestCapacitySchedulerPerf.java @@ -31,25 +31,32 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.factories.RecordFactory; import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider; +import org.apache.hadoop.yarn.server.resourcemanager.MockNM; import org.apache.hadoop.yarn.server.resourcemanager.MockNodes; import org.apache.hadoop.yarn.server.resourcemanager.MockRM; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppImpl; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptMetrics; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceLimits; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.AppAddedSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.AppAttemptAddedSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeAddedSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeUpdateSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.SchedulerEvent; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.placement.SimpleCandidateNodeSet; import org.apache.hadoop.yarn.server.utils.BuilderUtils; import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator; import org.apache.hadoop.yarn.util.resource.ResourceUtils; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; +import org.junit.Assert; import org.junit.Assume; import org.junit.Test; @@ -58,6 +65,7 @@ import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue; +import java.util.Random; import static org.apache.hadoop.yarn.server.resourcemanager.resource.TestResourceProfiles.TEST_CONF_RESET_RESOURCE_TYPES; import static org.mockito.Mockito.mock; @@ -262,4 +270,88 @@ public void testUserLimitThroughputForFourResources() throws Exception { public void testUserLimitThroughputForFiveResources() throws Exception { testUserLimitThroughputWithNumberOfResourceTypes(5); } + + @Test(timeout = 300000) + public void testAssignContainersPerformanceForOneHundredQueues() + throws Exception { + testAssignContainersPerformanceForLargeScaleQueues(100, 1000); + } + + @Test(timeout = 300000) + public void testAssignContainersPerformanceForFiveHundredQueues() + throws Exception { + testAssignContainersPerformanceForLargeScaleQueues(500, 1000); + } + + @Test(timeout = 300000) + public void testAssignContainersPerformanceForOneThousandQueues() + throws Exception { + testAssignContainersPerformanceForLargeScaleQueues(1000, 1000); + } + + @Test(timeout = 300000) + public void testAssignContainersPerformanceForFiveThousandQueues() + throws Exception { + testAssignContainersPerformanceForLargeScaleQueues(5000, 1000); + } + + private void testAssignContainersPerformanceForLargeScaleQueues(int queueSize, + int testingTimes) throws Exception { + // init conf + CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration(); + float capacity = 100.0f / queueSize; + String[] queues = new String[queueSize]; + for (int i = 0; i < queueSize; i++) { + queues[i] = "q" + i; + conf.setCapacity("root." + queues[i], capacity); + conf.setMaximumCapacity("root." + queues[i], 100); + } + conf.setQueues(CapacitySchedulerConfiguration.ROOT, queues); + // init RM & NMs & Nodes + final MockRM rm = new MockRM(conf); + rm.start(); + final MockNM nm1 = rm.registerNode("h1:1234", 9 * GB); + // init scheduler nodes + int waitTime = 1000; + while (waitTime > 0 && + ((AbstractYarnScheduler) rm.getRMContext().getScheduler()) + .getNodeTracker().nodeCount() < 2) { + waitTime -= 10; + Thread.sleep(10); + } + Assert.assertEquals(1, + ((AbstractYarnScheduler) rm.getRMContext().getScheduler()) + .getNodeTracker().nodeCount()); + // Quiet the loggers while measuring performance + for (Enumeration loggers = LogManager.getCurrentLoggers(); loggers + .hasMoreElements();) { + Logger logger = (Logger) loggers.nextElement(); + logger.setLevel(Level.WARN); + } + LogManager.getLogger("org.apache.hadoop.yarn.server.resourcemanager") + .setLevel(Level.WARN); + // assign containers for every queue + CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler(); + FiCaSchedulerNode node1 = cs.getAllNodes().get(0); + long startTime; + long totalTime = 0; + Random rand = new Random(); + for (int i = 0; i < testingTimes; i++) { + long queueIndex = rand.nextInt(queueSize); + RMApp app = rm.submitApp(200, "app", "user", null, "q" + queueIndex); + startTime = System.nanoTime(); + cs.getRootQueue().assignContainers(nm1.getCapatibility(), + new SimpleCandidateNodeSet<>(node1), + new ResourceLimits(nm1.getCapatibility()), + SchedulingMode.RESPECT_PARTITION_EXCLUSIVITY); + totalTime += System.nanoTime() - startTime; + rm.killApp(app.getApplicationId()); + } + System.out.println( + "#QueueSize = " + queueSize + ", testing times : " + testingTimes + + ", total cost time : " + totalTime + " ns, average cost time : " + + (float) totalTime / testingTimes + " ns."); + rm.stop(); + } + } 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/TestChildQueueOrder.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/TestChildQueueOrder.java index fcfa0dd..fb452a7 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/TestChildQueueOrder.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/TestChildQueueOrder.java @@ -124,6 +124,9 @@ private void stubQueueAllocation(final CSQueue queue, final Resource clusterResource, final FiCaSchedulerNode node, final int allocation, final NodeType type) { + if (queue.getParent() != null){ + ((ParentQueue)queue.getParent()).demandUpdated(queue); + } // Simulate the queue allocation doAnswer(new Answer() { @Override 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/TestNodeLabelContainerAllocation.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/TestNodeLabelContainerAllocation.java index 1836919..1c983f0 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/TestNodeLabelContainerAllocation.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/TestNodeLabelContainerAllocation.java @@ -1685,15 +1685,16 @@ public RMNodeLabelsManager createNodeLabelManager() { cs.getApplicationAttempt(am4.getApplicationAttemptId())); // Test case 8 - // After d allocated, c will go first, c/d has same use_capacity(x), so compare c/d's lexicographic order + // After d allocated, c/d has same use_capacity(x), + // d will go first because d is in front of c after test case 7 doNMHeartbeat(rm, nm1.getNodeId(), 1); checkNumOfContainersInAnAppOnGivenNode(2, nm1.getNodeId(), cs.getApplicationAttempt(am1.getApplicationAttemptId())); checkNumOfContainersInAnAppOnGivenNode(3, nm1.getNodeId(), cs.getApplicationAttempt(am2.getApplicationAttemptId())); - checkNumOfContainersInAnAppOnGivenNode(2, nm1.getNodeId(), - cs.getApplicationAttempt(am3.getApplicationAttemptId())); checkNumOfContainersInAnAppOnGivenNode(1, nm1.getNodeId(), + cs.getApplicationAttempt(am3.getApplicationAttemptId())); + checkNumOfContainersInAnAppOnGivenNode(2, nm1.getNodeId(), cs.getApplicationAttempt(am4.getApplicationAttemptId())); } 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/TestParentQueue.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/TestParentQueue.java index fe66aba..cb7cec6 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/TestParentQueue.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/TestParentQueue.java @@ -178,7 +178,10 @@ private void stubQueueAllocation(final CSQueue queue, private void stubQueueAllocation(final CSQueue queue, final Resource clusterResource, final FiCaSchedulerNode node, final int allocation, final NodeType type) { - + + if (queue.getParent() != null){ + ((ParentQueue)queue.getParent()).demandUpdated(queue); + } // Simulate the queue allocation doAnswer(new Answer() { @Override 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/TestQueueParsing.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/TestQueueParsing.java index add14ab..c9009e4 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/TestQueueParsing.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/TestQueueParsing.java @@ -27,6 +27,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.service.ServiceOperations; +import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.MockRM; @@ -1134,6 +1135,10 @@ public void testQueueOrderingPolicyUpdatedAfterReinitialize() checkEqualsToQueueSet(bQ.getChildQueues(), new String[] { "b1", "b2", "b3", "b4" }); + bQ.getChildQueues().stream().forEach(e -> { + e.getQueueResourceUsage().incPending(Resource.newInstance(1024, 1)); + bQ.demandUpdated(e); + }); PriorityUtilizationQueueOrderingPolicy queueOrderingPolicy = (PriorityUtilizationQueueOrderingPolicy) bQ.getQueueOrderingPolicy(); checkEqualsToQueueSet(queueOrderingPolicy.getQueues(), 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/policy/TestPriorityUtilizationQueueOrderingPolicy.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/policy/TestPriorityUtilizationQueueOrderingPolicy.java index ca9a84b..4c074d3 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/policy/TestPriorityUtilizationQueueOrderingPolicy.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/policy/TestPriorityUtilizationQueueOrderingPolicy.java @@ -21,7 +21,9 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableTable; import org.apache.hadoop.yarn.api.records.Priority; +import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueResourceQuotas; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceUsage; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.QueueCapacities; import org.junit.Assert; @@ -56,6 +58,9 @@ QueueResourceQuotas qr = new QueueResourceQuotas(); when(q.getQueueResourceQuotas()).thenReturn(qr); + ResourceUsage qru = mock(ResourceUsage.class); + when(qru.getAllPending()).thenReturn(Resource.newInstance(1,1)); + when(q.getQueueResourceUsage()).thenReturn(qru); list.add(q); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivities.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivities.java index 1e61186..a3244c3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivities.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivities.java @@ -102,7 +102,7 @@ public void testAssignMultipleContainersPerNodeHeartbeat() if (i != allocations.length() - 1) { verifyStateOfAllocations(allocations.getJSONObject(i), "finalAllocationState", "ALLOCATED"); - verifyQueueOrder(allocations.getJSONObject(i), "root-a-b-b2-b3-b1"); + verifyQueueOrder(allocations.getJSONObject(i), "root-b-b1"); } } } @@ -290,7 +290,7 @@ public void testReserveNewContainer() throws Exception { verifyNumberOfAllocations(json, 1); - verifyQueueOrder(json.getJSONObject("allocations"), "root-a-b-b3-b1"); + verifyQueueOrder(json.getJSONObject("allocations"), "root-b-b1"); JSONObject allocations = json.getJSONObject("allocations"); verifyStateOfAllocations(allocations, "finalAllocationState", "RESERVED");