YARN-8421: when moving app, activeUsers is increased, even though app does not have outstanding request. Contributed by Kyungwan Nam
(cherry picked from commit 937ef39b3ff90f72392b7a319e4346344db34e03) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/9a79e893 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/9a79e893 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/9a79e893 Branch: refs/remotes/origin/branch-3.1 Commit: 9a79e893f74ab97571d156b4f39a3b751aad240f Parents: 677bbdc Author: Eric E Payne <[email protected]> Authored: Mon Jul 16 16:24:21 2018 +0000 Committer: Eric E Payne <[email protected]> Committed: Mon Jul 16 16:32:05 2018 +0000 ---------------------------------------------------------------------- .../scheduler/AppSchedulingInfo.java | 4 +- .../TestSchedulerApplicationAttempt.java | 44 ++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/9a79e893/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java ---------------------------------------------------------------------- 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 1efdd8b..8074f06 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 @@ -578,7 +578,9 @@ public class AppSchedulingInfo { newMetrics.moveAppTo(this); abstractUsersManager.deactivateApplication(user, applicationId); abstractUsersManager = newQueue.getAbstractUsersManager(); - abstractUsersManager.activateApplication(user, applicationId); + if (!schedulerKeys.isEmpty()) { + abstractUsersManager.activateApplication(user, applicationId); + } this.queue = newQueue; } finally { this.writeLock.unlock(); http://git-wip-us.apache.org/repos/asf/hadoop/blob/9a79e893/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerApplicationAttempt.java ---------------------------------------------------------------------- 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 17f9d23..c110b1c 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 @@ -58,6 +58,50 @@ public class TestSchedulerApplicationAttempt { QueueMetrics.clearQueueMetrics(); DefaultMetricsSystem.shutdown(); } + + @Test + public void testActiveUsersWhenMove() { + final String user = "user1"; + Queue parentQueue = createQueue("parent", null); + Queue queue1 = createQueue("queue1", parentQueue); + Queue queue2 = createQueue("queue2", parentQueue); + Queue queue3 = createQueue("queue3", parentQueue); + + ApplicationAttemptId appAttId = createAppAttemptId(0, 0); + RMContext rmContext = mock(RMContext.class); + when(rmContext.getEpoch()).thenReturn(3L); + SchedulerApplicationAttempt app = new SchedulerApplicationAttempt(appAttId, + user, queue1, queue1.getAbstractUsersManager(), rmContext); + + // Resource request + Resource requestedResource = Resource.newInstance(1536, 2); + Priority requestedPriority = Priority.newInstance(2); + ResourceRequest request = ResourceRequest.newInstance(requestedPriority, + ResourceRequest.ANY, requestedResource, 1); + app.updateResourceRequests(Arrays.asList(request)); + + assertEquals(1, queue1.getAbstractUsersManager().getNumActiveUsers()); + // move app from queue1 to queue2 + app.move(queue2); + // Active user count has to decrease from queue1 + assertEquals(0, queue1.getAbstractUsersManager().getNumActiveUsers()); + // Increase the active user count in queue2 if the moved app has pending requests + assertEquals(1, queue2.getAbstractUsersManager().getNumActiveUsers()); + + // Allocated container + RMContainer container1 = createRMContainer(appAttId, 1, requestedResource); + app.liveContainers.put(container1.getContainerId(), container1); + SchedulerNode node = createNode(); + app.appSchedulingInfo.allocate(NodeType.OFF_SWITCH, node, + toSchedulerKey(requestedPriority), container1.getContainer()); + + // Active user count has to decrease from queue2 due to app has NO pending requests + assertEquals(0, queue2.getAbstractUsersManager().getNumActiveUsers()); + // move app from queue2 to queue3 + app.move(queue3); + // Active user count in queue3 stays same if the moved app has NO pending requests + assertEquals(0, queue3.getAbstractUsersManager().getNumActiveUsers()); + } @Test public void testMove() { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
