Browse Source

YARN-4047. ClientRMService getApplications has high scheduler lock contention. Contributed by Jason Lowe
(cherry picked from commit 7a445fcfabcf9c6aae219051f65d3f6cb8feb87c)

(cherry picked from commit 703fa1b141a98449746bd6fb3b144e74d964d1f5)

Jian He 10 năm trước cách đây
mục cha
commit
2b526ba757

+ 3 - 0
hadoop-yarn-project/CHANGES.txt

@@ -202,6 +202,9 @@ Release 2.6.1 - UNRELEASED
 
     YARN-3999. RM hangs on draing events. (Jian He via xgong)
 
+    YARN-4047. ClientRMService getApplications has high scheduler lock contention.
+    (Jason Lowe via jianhe)
+
 Release 2.6.0 - 2014-11-18
 
   INCOMPATIBLE CHANGES

+ 7 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClientRMService.java

@@ -738,13 +738,9 @@ public class ClientRMService extends AbstractService implements
       RMApp application = appsIter.next();
 
       // Check if current application falls under the specified scope
-      boolean allowAccess = checkAccess(callerUGI, application.getUser(),
-          ApplicationAccessType.VIEW_APP, application);
       if (scope == ApplicationsRequestScope.OWN &&
           !callerUGI.getUserName().equals(application.getUser())) {
         continue;
-      } else if (scope == ApplicationsRequestScope.VIEWABLE && !allowAccess) {
-        continue;
       }
 
       if (applicationTypes != null && !applicationTypes.isEmpty()) {
@@ -793,6 +789,13 @@ public class ClientRMService extends AbstractService implements
         }
       }
 
+      // checkAccess can grab the scheduler lock so call it last
+      boolean allowAccess = checkAccess(callerUGI, application.getUser(),
+          ApplicationAccessType.VIEW_APP, application);
+      if (scope == ApplicationsRequestScope.VIEWABLE && !allowAccess) {
+        continue;
+      }
+
       reports.add(application.createAndGetApplicationReport(
           callerUGI.getUserName(), allowAccess));
     }