Procházet zdrojové kódy

YARN-8421: when moving app, activeUsers is increased, even though app does not have outstanding request. Contributed by Kyungwan Nam

Eric E Payne před 6 roky
rodič
revize
c60f42955f

+ 3 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java

@@ -767,7 +767,9 @@ public class AppSchedulingInfo {
     newMetrics.moveAppTo(this);
     activeUsersManager.deactivateApplication(user, applicationId);
     activeUsersManager = newQueue.getActiveUsersManager();
-    activeUsersManager.activateApplication(user, applicationId);
+    if (!priorities.isEmpty()) {
+      activeUsersManager.activateApplication(user, applicationId);
+    }
     this.queue = newQueue;
   }
 

+ 44 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerApplicationAttempt.java

@@ -56,6 +56,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.getActiveUsersManager(), 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.getActiveUsersManager().getNumActiveUsers());
+    // move app from queue1 to queue2
+    app.move(queue2);
+    // Active user count has to decrease from queue1
+    assertEquals(0, queue1.getActiveUsersManager().getNumActiveUsers());
+    // Increase the active user count in queue2 if the moved app has pending requests
+    assertEquals(1, queue2.getActiveUsersManager().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, requestedPriority,
+        request, container1.getContainer());
+
+    // Active user count has to decrease from queue2 due to app has NO pending requests
+    assertEquals(0, queue2.getActiveUsersManager().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.getActiveUsersManager().getNumActiveUsers());
+  }
   
   @Test
   public void testMove() {