From b3c3b4c59b40bf7fbe8042603fa1fb4d426768db Mon Sep 17 00:00:00 2001 From: Prabhu Joseph Date: Mon, 12 Aug 2019 20:19:27 +0530 Subject: [PATCH] YARN-9290. Reject Invalid SchedulingRequest by Scheduler PlacementConstraintHandler. --- .../resourcemanager/DefaultAMSProcessor.java | 3 ++ .../resourcemanager/scheduler/Allocation.java | 19 ++++++--- .../scheduler/AppSchedulingInfo.java | 26 +++++++++++- .../scheduler/common/fica/FiCaSchedulerApp.java | 2 +- .../scheduler/fair/FairScheduler.java | 2 +- .../scheduler/placement/AppPlacementAllocator.java | 5 +++ .../SingleConstraintAppPlacementAllocator.java | 1 + .../scheduler/TestAppSchedulingInfo.java | 9 ++++- .../scheduler/TestSchedulerApplicationAttempt.java | 7 ++++ .../scheduler/capacity/TestLeafQueue.java | 1 + .../TestSchedulingRequestContainerAllocation.java | 47 ++++++++++++++++++++++ .../scheduler/capacity/TestUtils.java | 1 + .../scheduler/fair/TestMaxRunningAppsEnforcer.java | 1 + .../scheduler/fair/TestQueueManager.java | 1 + .../scheduler/fifo/TestFifoScheduler.java | 1 + 15 files changed, 114 insertions(+), 12 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/DefaultAMSProcessor.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/DefaultAMSProcessor.java index 6763d66..25bbb8b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/DefaultAMSProcessor.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/DefaultAMSProcessor.java @@ -349,6 +349,9 @@ public void allocate(ApplicationAttemptId appAttemptId, response.setContainersFromPreviousAttempts( allocation.getPreviousAttemptContainers()); + + response.setRejectedSchedulingRequests(allocation.getRejectedRequest()); + } private void handleInvalidResourceException(InvalidResourceRequestException e, 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/Allocation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Allocation.java index 9573ac8..ffbb587 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Allocation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Allocation.java @@ -26,6 +26,7 @@ import org.apache.hadoop.yarn.api.records.NMToken; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; +import org.apache.hadoop.yarn.api.records.RejectedSchedulingRequest; public class Allocation { @@ -40,7 +41,7 @@ final List demotedContainers; private final List previousAttemptContainers; private Resource resourceLimit; - + private List rejectedRequest; public Allocation(List containers, Resource resourceLimit, Set strictContainers, Set fungibleContainers, @@ -52,17 +53,17 @@ public Allocation(List containers, Resource resourceLimit, public Allocation(List containers, Resource resourceLimit, Set strictContainers, Set fungibleContainers, List fungibleResources, List nmTokens) { - this(containers, resourceLimit,strictContainers, fungibleContainers, - fungibleResources, nmTokens, null, null, null, null, null); + this(containers, resourceLimit, strictContainers, fungibleContainers, + fungibleResources, nmTokens, null, null, null, null, null, null); } public Allocation(List containers, Resource resourceLimit, Set strictContainers, Set fungibleContainers, List fungibleResources, List nmTokens, List increasedContainers, List decreasedContainer) { - this(containers, resourceLimit,strictContainers, fungibleContainers, + this(containers, resourceLimit, strictContainers, fungibleContainers, fungibleResources, nmTokens, increasedContainers, decreasedContainer, - null, null, null); + null, null, null, null); } public Allocation(List containers, Resource resourceLimit, @@ -70,7 +71,8 @@ public Allocation(List containers, Resource resourceLimit, List fungibleResources, List nmTokens, List increasedContainers, List decreasedContainer, List promotedContainers, List demotedContainer, - List previousAttemptContainers) { + List previousAttemptContainers, List + rejectedRequest) { this.containers = containers; this.resourceLimit = resourceLimit; this.strictContainers = strictContainers; @@ -82,6 +84,7 @@ public Allocation(List containers, Resource resourceLimit, this.promotedContainers = promotedContainers; this.demotedContainers = demotedContainer; this.previousAttemptContainers = previousAttemptContainers; + this.rejectedRequest = rejectedRequest; } public List getContainers() { @@ -128,6 +131,10 @@ public Resource getResourceLimit() { return previousAttemptContainers; } + public List getRejectedRequest() { + return rejectedRequest; + } + @VisibleForTesting public void setResourceLimit(Resource resource) { this.resourceLimit = resource; 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/AppSchedulingInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java index 4abb712..259e30f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java @@ -42,7 +42,10 @@ import org.apache.hadoop.yarn.api.records.ExecutionType; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; +import org.apache.hadoop.yarn.api.records.RejectionReason; +import org.apache.hadoop.yarn.api.records.RejectedSchedulingRequest; import org.apache.hadoop.yarn.api.records.SchedulingRequest; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; @@ -98,6 +101,7 @@ public final ContainerUpdateContext updateContext; private final Map applicationSchedulingEnvs = new HashMap<>(); private final RMContext rmContext; + private final int retryAttempts; public AppSchedulingInfo(ApplicationAttemptId appAttemptId, String user, Queue queue, AbstractUsersManager abstractUsersManager, long epoch, @@ -113,6 +117,9 @@ public AppSchedulingInfo(ApplicationAttemptId appAttemptId, String user, this.appResourceUsage = appResourceUsage; this.applicationSchedulingEnvs.putAll(applicationSchedulingEnvs); this.rmContext = rmContext; + this.retryAttempts = rmContext.getYarnConfiguration().getInt( + YarnConfiguration.RM_PLACEMENT_CONSTRAINTS_RETRY_ATTEMPTS, + YarnConfiguration.DEFAULT_RM_PLACEMENT_CONSTRAINTS_RETRY_ATTEMPTS); ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); updateContext = new ContainerUpdateContext(this); @@ -496,6 +503,21 @@ public boolean getAndResetBlacklistChanged() { return ret; } + public List getRejectedRequest() { + List ret = new ArrayList<>(); + try { + this.readLock.lock(); + schedulerKeyToAppPlacementAllocator.values().stream() + .filter(ap -> ap.getPlacementAttempt() >= retryAttempts) + .forEach(ap -> ret.add(RejectedSchedulingRequest.newInstance( + RejectionReason.COULD_NOT_SCHEDULE_ON_NODE, + ap.getSchedulingRequest()))); + } finally { + this.readLock.unlock(); + } + return ret; + } + public PendingAsk getNextPendingAsk() { readLock.lock(); try { @@ -780,8 +802,8 @@ public boolean precheckNode(SchedulerRequestKey schedulerKey, try { AppPlacementAllocator ap = schedulerKeyToAppPlacementAllocator.get(schedulerKey); - return (ap != null) && ap.precheckNode(schedulerNode, - schedulingMode, dcOpt); + return (ap != null) && (ap.getPlacementAttempt() < retryAttempts) && + ap.precheckNode(schedulerNode, schedulingMode); } finally { this.readLock.unlock(); } 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/common/fica/FiCaSchedulerApp.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java index 71aa865..0789bfd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java @@ -821,7 +821,7 @@ public Allocation getAllocation(ResourceCalculator resourceCalculator, currentContPreemption, Collections.singletonList(rr), updatedNMTokens, newlyIncreasedContainers, newlyDecreasedContainers, newlyPromotedContainers, newlyDemotedContainers, - previousAttemptContainers); + previousAttemptContainers, appSchedulingInfo.getRejectedRequest()); } finally { writeLock.unlock(); } 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 151a7ab..21b4567 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 @@ -948,7 +948,7 @@ public Allocation allocate(ApplicationAttemptId appAttemptId, updatedNMTokens, null, null, application.pullNewlyPromotedContainers(), application.pullNewlyDemotedContainers(), - previousAttemptContainers); + previousAttemptContainers, null); } private List validateResourceRequests( 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/placement/AppPlacementAllocator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/AppPlacementAllocator.java index d54a623..f00cf55 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/AppPlacementAllocator.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/AppPlacementAllocator.java @@ -57,6 +57,7 @@ protected AppSchedulingInfo appSchedulingInfo; protected SchedulerRequestKey schedulerRequestKey; protected RMContext rmContext; + protected int placementAttempt; /** * Get iterator of preferred node depends on requirement and/or availability. @@ -205,4 +206,8 @@ public void initialize(AppSchedulingInfo appSchedulingInfo, * @return SchedulingRequest */ public abstract SchedulingRequest getSchedulingRequest(); + + public int getPlacementAttempt() { + return placementAttempt; + } } 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/placement/SingleConstraintAppPlacementAllocator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/SingleConstraintAppPlacementAllocator.java index 3fc3afb..55252b3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/SingleConstraintAppPlacementAllocator.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/SingleConstraintAppPlacementAllocator.java @@ -363,6 +363,7 @@ private boolean checkCardinalityAndPending(SchedulerNode node, placementConstraintManager, allocationTagsManager, dcOpt); } catch (InvalidAllocationTagsQueryException e) { LOG.warn("Failed to query node cardinality:", e); + this.placementAttempt++; return false; } } 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/TestAppSchedulingInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAppSchedulingInfo.java index df8309b..62e5f3d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAppSchedulingInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAppSchedulingInfo.java @@ -28,6 +28,7 @@ import org.apache.hadoop.yarn.api.records.Priority; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.TestUtils; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FSLeafQueue; @@ -44,10 +45,12 @@ public void testBacklistChanged() { ApplicationAttemptId.newInstance(appIdImpl, 1); FSLeafQueue queue = mock(FSLeafQueue.class); + RMContext rmContext = mock(RMContext.class); doReturn("test").when(queue).getQueueName(); + doReturn(new YarnConfiguration()).when(rmContext).getYarnConfiguration(); AppSchedulingInfo appSchedulingInfo = new AppSchedulingInfo(appAttemptId, "test", queue, null, 0, new ResourceUsage(), - new HashMap(), null); + new HashMap(), rmContext); appSchedulingInfo.updatePlacesBlacklistedByApp(new ArrayList(), new ArrayList()); @@ -117,9 +120,11 @@ public void testSchedulerKeyAccounting() { Queue queue = mock(Queue.class); doReturn(mock(QueueMetrics.class)).when(queue).getMetrics(); + RMContext rmContext = mock(RMContext.class); + doReturn(new YarnConfiguration()).when(rmContext).getYarnConfiguration(); AppSchedulingInfo info = new AppSchedulingInfo( appAttemptId, "test", queue, mock(ActiveUsersManager.class), 0, - new ResourceUsage(), new HashMap<>(), mock(RMContext.class)); + new ResourceUsage(), new HashMap<>(), rmContext); Assert.assertEquals(0, info.getSchedulerKeys().size()); Priority pri1 = Priority.newInstance(1); 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/TestSchedulerApplicationAttempt.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerApplicationAttempt.java index c3fe5f5..873b100 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerApplicationAttempt.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerApplicationAttempt.java @@ -40,6 +40,7 @@ import org.apache.hadoop.yarn.api.records.QueueState; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceRequest; +import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerImpl; @@ -75,6 +76,7 @@ public void testActiveUsersWhenMove() { ApplicationAttemptId appAttId = createAppAttemptId(0, 0); RMContext rmContext = mock(RMContext.class); when(rmContext.getEpoch()).thenReturn(3L); + when(rmContext.getYarnConfiguration()).thenReturn(conf); SchedulerApplicationAttempt app = new SchedulerApplicationAttempt(appAttId, user, queue1, queue1.getAbstractUsersManager(), rmContext); @@ -121,6 +123,7 @@ public void testMove() { ApplicationAttemptId appAttId = createAppAttemptId(0, 0); RMContext rmContext = mock(RMContext.class); when(rmContext.getEpoch()).thenReturn(3L); + when(rmContext.getYarnConfiguration()).thenReturn(conf); SchedulerApplicationAttempt app = new SchedulerApplicationAttempt(appAttId, user, oldQueue, oldQueue.getAbstractUsersManager(), rmContext); oldMetrics.submitApp(user); @@ -242,6 +245,7 @@ public void testAppPercentages() throws Exception { RMContext rmContext = mock(RMContext.class); when(rmContext.getEpoch()).thenReturn(3L); when(rmContext.getScheduler()).thenReturn(scheduler); + when(rmContext.getYarnConfiguration()).thenReturn(conf); final String user = "user1"; Queue queue = createQueue("test", null); @@ -300,6 +304,7 @@ public void testAppPercentagesOnswitch() throws Exception { RMContext rmContext = mock(RMContext.class); when(rmContext.getEpoch()).thenReturn(3L); when(rmContext.getScheduler()).thenReturn(scheduler); + when(rmContext.getYarnConfiguration()).thenReturn(conf); final String user = "user1"; Queue queue = createQueue("test", null); @@ -322,6 +327,7 @@ public void testSchedulingOpportunityOverflow() throws Exception { Queue queue = createQueue("test", null); RMContext rmContext = mock(RMContext.class); when(rmContext.getEpoch()).thenReturn(3L); + when(rmContext.getYarnConfiguration()).thenReturn(conf); SchedulerApplicationAttempt app = new SchedulerApplicationAttempt( attemptId, "user", queue, queue.getAbstractUsersManager(), rmContext); Priority priority = Priority.newInstance(1); @@ -347,6 +353,7 @@ public void testHasPendingResourceRequest() throws Exception { Queue queue = createQueue("test", null); RMContext rmContext = mock(RMContext.class); when(rmContext.getEpoch()).thenReturn(3L); + when(rmContext.getYarnConfiguration()).thenReturn(conf); SchedulerApplicationAttempt app = new SchedulerApplicationAttempt( attemptId, "user", queue, queue.getAbstractUsersManager(), rmContext); 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/TestLeafQueue.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/TestLeafQueue.java index 6a4391a..ec768aa 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/TestLeafQueue.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/TestLeafQueue.java @@ -3997,6 +3997,7 @@ public void testApplicationQueuePercent() RMNodeLabelsManager nlm = mock(RMNodeLabelsManager.class); when(nlm.getResourceByLabel(any(), any())).thenReturn(res); when(rmContext.getNodeLabelManager()).thenReturn(nlm); + when(rmContext.getYarnConfiguration()).thenReturn(csConf); // Queue "test" consumes 100% of the cluster, so its capacity and absolute // capacity are both 1.0f. 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/TestSchedulingRequestContainerAllocation.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/TestSchedulingRequestContainerAllocation.java index 2c1476e..915ff77 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/TestSchedulingRequestContainerAllocation.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/TestSchedulingRequestContainerAllocation.java @@ -448,6 +448,53 @@ public RMNodeLabelsManager createNodeLabelManager() { rm1.close(); } + @Test(timeout = 30000L) + public void testInvalidSchedulingRequest() throws Exception { + Configuration csConf = TestUtils.getConfigurationWithMultipleQueues(conf); + MockRM rm1 = new MockRM(csConf) { + @Override + public RMNodeLabelsManager createNodeLabelManager() { + return mgr; + } + }; + + rm1.getRMContext().setNodeLabelManager(mgr); + rm1.start(); + + // 4 NMs. + MockNM[] nms = new MockNM[4]; + RMNode[] rmNodes = new RMNode[4]; + for (int i = 0; i < 4; i++) { + nms[i] = rm1.registerNode("192.168.0." + i + ":1234", 10 * GB); + rmNodes[i] = rm1.getRMContext().getRMNodes().get(nms[i].getNodeId()); + } + + RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c"); + MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]); + + // Constraint with Invalid Allocation Tag Namespace + PlacementConstraint constraint = targetNotIn("node", + allocationTagWithNamespace("invalid", "t1")).build(); + SchedulingRequest sc = SchedulingRequest + .newInstance(1, Priority.newInstance(1), + ExecutionTypeRequest.newInstance(ExecutionType.GUARANTEED), + ImmutableSet.of("t1"), + ResourceSizing.newInstance(1, Resource.newInstance(1024, 1)), + constraint); + AllocateRequest request = AllocateRequest.newBuilder() + .schedulingRequests(ImmutableList.of(sc)).build(); + am1.allocate(request); + + while (true) { + doNodeHeartbeat(nms); + AllocateResponse response = am1.schedule(); + if (response.getRejectedSchedulingRequests().size() == 1) { + return; + } + Thread.sleep(500); + } + } + private static void doNodeHeartbeat(MockNM... nms) throws Exception { for (MockNM nm : nms) { nm.nodeHeartbeat(true); 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/TestUtils.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/TestUtils.java index 3a64a8a..15030a7 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/TestUtils.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/TestUtils.java @@ -121,6 +121,7 @@ public Resource answer(InvocationOnMock invocation) throws Throwable { } }); + rmContext.setYarnConfiguration(conf); rmContext.setNodeLabelManager(nlm); rmContext.setSystemMetricsPublisher(mock(SystemMetricsPublisher.class)); rmContext.setRMApplicationHistoryWriter(mock(RMApplicationHistoryWriter.class)); 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/TestMaxRunningAppsEnforcer.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/TestMaxRunningAppsEnforcer.java index c692349..52f929e 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/TestMaxRunningAppsEnforcer.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/TestMaxRunningAppsEnforcer.java @@ -52,6 +52,7 @@ public void setup() { rmContext = mock(RMContext.class); when(rmContext.getQueuePlacementManager()).thenReturn(placementManager); when(rmContext.getEpoch()).thenReturn(0L); + when(rmContext.getYarnConfiguration()).thenReturn(conf); clock = new ControlledClock(); scheduler = mock(FairScheduler.class); when(scheduler.getConf()).thenReturn(conf); 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/TestQueueManager.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/TestQueueManager.java index d888d23..6dba939 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/TestQueueManager.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/TestQueueManager.java @@ -571,6 +571,7 @@ public void testApplicationAssignmentPreventsRemovalOfDynamicQueue() { ActiveUsersManager activeUsersManager = Mockito.mock(ActiveUsersManager.class); RMContext rmContext = Mockito.mock(RMContext.class); + doReturn(conf).when(rmContext).getYarnConfiguration(); // the appAttempt is created // removeEmptyDynamicQueues() should not remove the 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/fifo/TestFifoScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/TestFifoScheduler.java index dc94e5e..33b67a7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/TestFifoScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/TestFifoScheduler.java @@ -193,6 +193,7 @@ public void testAppAttemptMetrics() throws Exception { Configuration conf = new Configuration(); ((RMContextImpl) rmContext).setScheduler(scheduler); + ((RMContextImpl) rmContext).setYarnConfiguration(conf); scheduler.setRMContext(rmContext); scheduler.init(conf); scheduler.start(); -- 2.7.4 (Apple Git-66)