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/LeafQueue.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/LeafQueue.java index 7b2f39b402..9c8f97eac7 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/LeafQueue.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/LeafQueue.java @@ -847,8 +847,9 @@ protected void activateApplications() { + " AM node-partition name " + partitionName); } - if (!Resources.lessThanOrEqual(resourceCalculator, lastClusterResource, - amIfStarted, amLimit)) { + if (!application.getUnmanagedAM() && !Resources + .lessThanOrEqual(resourceCalculator, lastClusterResource, + amIfStarted, amLimit)) { if (getNumActiveApplications() < 1 || (Resources.lessThanOrEqual( resourceCalculator, lastClusterResource, queueUsage.getAMUsed(partitionName), Resources.none()))) { @@ -883,8 +884,9 @@ protected void activateApplications() { application.getAMResource(partitionName), user.getConsumedAMResources(partitionName)); - if (!Resources.lessThanOrEqual(resourceCalculator, lastClusterResource, - userAmIfStarted, userAMLimit)) { + if (!application.getUnmanagedAM() && !Resources + .lessThanOrEqual(resourceCalculator, lastClusterResource, + userAmIfStarted, userAMLimit)) { if (getNumActiveApplications() < 1 || (Resources.lessThanOrEqual( resourceCalculator, lastClusterResource, queueUsage.getAMUsed(partitionName), Resources.none()))) { 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 ad9fce9ac5..5c2ccef889 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 @@ -4112,6 +4112,48 @@ public void testSetupQueueConfigsWithSpecifiedConfiguration() } } + /** + * Test unmanaged AM should not be affected by AMLimit or userAMLimit: + * Create two unmanaged apps in partition a with non resource, they will be + * activated immediately. + * @throws IOException + */ + @Test + public void testUnmanagedAMShouldNotBeAffectedByAMlimit() throws IOException { + final String leafQueueName = "leaf-queue"; + final String user_0 = "user_0"; + final String partitionName = "a"; + + LeafQueue leafQueue = + new LeafQueue(csContext, csConf, leafQueueName, cs.getRootQueue(), null); + Resource amLimit = leafQueue.getAMResourceLimitPerPartition(partitionName); + Assert.assertEquals(0, amLimit.getMemorySize()); + Assert.assertEquals(0, amLimit.getVirtualCores()); + + // Submit 2 applications for user_0 in partition a + final ApplicationAttemptId appAttemptId_0 = + TestUtils.getMockApplicationAttemptId(0, 0); + FiCaSchedulerApp app_0 = + new FiCaSchedulerApp(appAttemptId_0, user_0, leafQueue, + mock(ActiveUsersManager.class), spyRMContext); + app_0.setAppAMNodePartitionName(partitionName); + app_0.setAMResource(partitionName, Resource.newInstance(1024, 1)); + leafQueue.submitApplicationAttempt(app_0, user_0); + Assert.assertTrue(app_0.getUnmanagedAM()); + Assert.assertEquals(1, leafQueue.getNumActiveApplications()); + + final ApplicationAttemptId appAttemptId_1 = + TestUtils.getMockApplicationAttemptId(1, 0); + FiCaSchedulerApp app_1 = + new FiCaSchedulerApp(appAttemptId_1, user_0, leafQueue, + mock(ActiveUsersManager.class), spyRMContext); + app_1.setAppAMNodePartitionName(partitionName); + app_1.setAMResource(partitionName, Resource.newInstance(1024, 1)); + leafQueue.submitApplicationAttempt(app_1, user_0); + Assert.assertTrue(app_1.getUnmanagedAM()); + Assert.assertEquals(2, leafQueue.getNumActiveApplications()); + } + private ApplicationAttemptId createAppAttemptId(int appId, int attemptId) { ApplicationId appIdImpl = ApplicationId.newInstance(0, appId); ApplicationAttemptId attId =