Bläddra i källkod

Major ASM/RM cleanup. Streamlining classes, interface and events. Contributed by Vinod Kumar Vavilapalli.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/MR-279@1143250 13f79535-47bb-0310-9956-ffa450edef68
Vinod Kumar Vavilapalli 14 år sedan
förälder
incheckning
a1807ed242
74 ändrade filer med 1469 tillägg och 1524 borttagningar
  1. 2 0
      mapreduce/CHANGES.txt
  2. 1 0
      mapreduce/mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/launcher/ContainerLauncherImpl.java
  3. 4 6
      mapreduce/mr-client/hadoop-mapreduce-client-common/src/main/java/org/apache/hadoop/mapreduce/TypeConverter.java
  4. 17 17
      mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ClientServiceDelegate.java
  5. 12 8
      mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java
  6. 3 3
      mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/YARNRunner.java
  7. 18 15
      mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestClientRedirect.java
  8. 2 2
      mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/v2/TestMRJobsWithHistoryService.java
  9. 3 3
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/ClientRMProtocol.java
  10. 3 3
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetAllApplicationsResponse.java
  11. 0 8
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetApplicationMasterResponse.java
  12. 1 1
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetApplicationReportRequest.java
  13. 8 0
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetApplicationReportResponse.java
  14. 18 18
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetAllApplicationsResponsePBImpl.java
  15. 0 91
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetApplicationMasterResponsePBImpl.java
  16. 12 12
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetApplicationReportRequestPBImpl.java
  17. 91 0
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetApplicationReportResponsePBImpl.java
  18. 10 1
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationReport.java
  19. 2 2
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/QueueInfo.java
  20. 72 21
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationReportPBImpl.java
  21. 17 17
      mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/QueueInfoPBImpl.java
  22. 1 1
      mapreduce/yarn/yarn-api/src/main/proto/client_RM_protocol.proto
  23. 10 7
      mapreduce/yarn/yarn-api/src/main/proto/yarn_protos.proto
  24. 4 4
      mapreduce/yarn/yarn-api/src/main/proto/yarn_service_protos.proto
  25. 9 9
      mapreduce/yarn/yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ClientRMProtocolPBClientImpl.java
  26. 10 10
      mapreduce/yarn/yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ClientRMProtocolPBServiceImpl.java
  27. 35 5
      mapreduce/yarn/yarn-common/src/test/java/org/apache/hadoop/yarn/MockApps.java
  28. 28 25
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java
  29. 10 13
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationsManager.java
  30. 201 29
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClientRMService.java
  31. 61 14
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java
  32. 38 39
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLauncher.java
  33. 4 3
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLivelinessMonitor.java
  34. 0 235
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMTracker.java
  35. 4 1
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/Application.java
  36. 144 140
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationImpl.java
  37. 11 11
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterLauncher.java
  38. 0 95
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManager.java
  39. 56 188
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManagerImpl.java
  40. 43 53
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SchedulerNegotiator.java
  41. 4 5
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMAllocatedEvent.java
  42. 16 5
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMFinishEvent.java
  43. 24 0
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMLauncherEventType.java
  44. 4 5
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMRegistrationEvent.java
  45. 4 5
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMStatusUpdateEvent.java
  46. 6 6
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ASMEvent.java
  47. 3 4
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationEvent.java
  48. 54 0
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationEventType.java
  49. 0 37
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationFinishEvent.java
  50. 0 83
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java
  51. 25 0
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationTrackerEventType.java
  52. 24 0
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/SNEventType.java
  53. 3 3
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Application.java
  54. 1 1
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/ResourceScheduler.java
  55. 3 3
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java
  56. 4 4
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java
  57. 4 4
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java
  58. 9 9
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java
  59. 2 2
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppsBlock.java
  60. 19 14
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppsList.java
  61. 3 1
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebApp.java
  62. 7 7
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java
  63. 6 2
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/Application.java
  64. 26 59
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/MockAsm.java
  65. 32 15
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMLaunchFailure.java
  66. 19 16
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCResponseId.java
  67. 27 12
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRestart.java
  68. 28 23
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestASMStateMachine.java
  69. 37 25
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationCleanup.java
  70. 43 31
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterExpiry.java
  71. 10 8
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterLauncher.java
  72. 8 7
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestSchedulerNegotiator.java
  73. 40 13
      mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebApp.java
  74. 9 5
      mapreduce/yarn/yarn-server/yarn-server-tests/src/test/java/org/apache/hadoop/yarn/server/TestContainerTokenSecretManager.java

+ 2 - 0
mapreduce/CHANGES.txt

@@ -5,6 +5,8 @@ Trunk (unreleased changes)
 
     MAPREDUCE-279
 
+    Major ASM cleanup. Streamlining classes, interface and events. (vinodkv)
+
     (1) Faster retries from AM to HistoryServer (2) Correct diagnostics for
     containers. (vinodkv)
 

+ 1 - 0
mapreduce/mr-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapreduce/v2/app/launcher/ContainerLauncherImpl.java

@@ -138,6 +138,7 @@ public class ContainerLauncherImpl extends AbstractService implements
 
     UserGroupInformation user = UserGroupInformation.getCurrentUser();
 
+    // TODO: Synchronization problems!!
     if (UserGroupInformation.isSecurityEnabled()) {
       if(!ugiMap.containsKey(containerManagerBindAddr)) {
         Token<ContainerTokenIdentifier> token =

+ 4 - 6
mapreduce/mr-client/hadoop-mapreduce-client-common/src/main/java/org/apache/hadoop/mapreduce/TypeConverter.java

@@ -18,8 +18,6 @@
 
 package org.apache.hadoop.mapreduce;
 
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -42,8 +40,8 @@ import org.apache.hadoop.mapreduce.v2.api.records.TaskId;
 import org.apache.hadoop.mapreduce.v2.api.records.TaskState;
 import org.apache.hadoop.mapreduce.v2.api.records.TaskType;
 import org.apache.hadoop.yarn.YarnException;
-import org.apache.hadoop.yarn.api.records.Application;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.NodeManagerInfo;
 import org.apache.hadoop.yarn.api.records.QueueACL;
@@ -404,7 +402,7 @@ public class TypeConverter {
     return taskTrackers.toArray(new TaskTrackerInfo[nodes.size()]);
   }
 
-  public static JobStatus fromYarn(Application application) {
+  public static JobStatus fromYarn(ApplicationReport application) {
     String trackingUrl = application.getTrackingUrl();
     trackingUrl = trackingUrl == null ? "" : trackingUrl;
 
@@ -421,9 +419,9 @@ public class TypeConverter {
     return jobStatus;
   }
 
-  public static JobStatus[] fromYarnApps(List<Application> applications) {
+  public static JobStatus[] fromYarnApps(List<ApplicationReport> applications) {
     List<JobStatus> jobStatuses = new ArrayList<JobStatus>();
-    for (Application application : applications) {
+    for (ApplicationReport application : applications) {
       jobStatuses.add(TypeConverter.fromYarn(application));
     }
     return jobStatuses.toArray(new JobStatus[jobStatuses.size()]);

+ 17 - 17
mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ClientServiceDelegate.java

@@ -53,7 +53,7 @@ import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.token.Token;
 import org.apache.hadoop.yarn.YarnException;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.exceptions.YarnRemoteException;
 import org.apache.hadoop.yarn.factories.RecordFactory;
@@ -106,30 +106,30 @@ public class ClientServiceDelegate {
     //TODO RM NPEs for unknown jobs. History may still be aware.
     // Possibly allow nulls through the PB tunnel, otherwise deal with an exception
     // and redirect to the history server.
-    ApplicationMaster appMaster = rm.getApplicationMaster(currentAppId);
-    while (!ApplicationState.COMPLETED.equals(appMaster.getState()) &&
-        !ApplicationState.FAILED.equals(appMaster.getState()) && 
-        !ApplicationState.KILLED.equals(appMaster.getState()) &&
-        !ApplicationState.ALLOCATING.equals(appMaster.getState())) {
+    ApplicationReport application = rm.getApplicationReport(currentAppId);
+    while (!ApplicationState.COMPLETED.equals(application.getState()) &&
+        !ApplicationState.FAILED.equals(application.getState()) && 
+        !ApplicationState.KILLED.equals(application.getState()) &&
+        !ApplicationState.ALLOCATING.equals(application.getState())) {
       try {
-        if (appMaster.getHost() == null || "".equals(appMaster.getHost())) {
+        if (application.getHost() == null || "".equals(application.getHost())) {
           LOG.debug("AM not assigned to Job. Waiting to get the AM ...");
           Thread.sleep(2000);
    
-          LOG.debug("Application state is " + appMaster.getState());
-          appMaster = rm.getApplicationMaster(currentAppId);
+          LOG.debug("Application state is " + application.getState());
+          application = rm.getApplicationReport(currentAppId);
           continue;
         }
-        serviceAddr = appMaster.getHost() + ":" + appMaster.getRpcPort();
-        serviceHttpAddr = appMaster.getTrackingUrl();
-        currentAppState = appMaster.getState();
+        serviceAddr = application.getHost() + ":" + application.getRpcPort();
+        serviceHttpAddr = application.getTrackingUrl();
+        currentAppState = application.getState();
         if (UserGroupInformation.isSecurityEnabled()) {
-          String clientTokenEncoded = appMaster.getClientToken();
+          String clientTokenEncoded = application.getClientToken();
           Token<ApplicationTokenIdentifier> clientToken =
             new Token<ApplicationTokenIdentifier>();
           clientToken.decodeFromUrlString(clientTokenEncoded);
-          clientToken.setService(new Text(appMaster.getHost() + ":"
-              + appMaster.getRpcPort()));
+          clientToken.setService(new Text(application.getHost() + ":"
+              + application.getRpcPort()));
           UserGroupInformation.getCurrentUser().addToken(clientToken);
         }
         LOG.info("Connecting to " + serviceAddr);
@@ -146,11 +146,11 @@ public class ClientServiceDelegate {
           Thread.sleep(2000);
         } catch (InterruptedException e1) {
         }
-        appMaster = rm.getApplicationMaster(currentAppId);
+        application = rm.getApplicationReport(currentAppId);
       }
     }
 
-    currentAppState = appMaster.getState();
+    currentAppState = application.getState();
     /** we just want to return if its allocating, so that we dont 
      * block on it. This is to be able to return job status 
      * on a allocating Application.

+ 12 - 8
mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/ResourceMgrDelegate.java

@@ -48,8 +48,8 @@ import org.apache.hadoop.yarn.api.ClientRMProtocol;
 import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsResponse;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterRequest;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterNodesRequest;
@@ -60,6 +60,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.GetQueueUserAclsInfoRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.QueueUserACLInfo;
 import org.apache.hadoop.yarn.api.records.YarnClusterMetrics;
@@ -301,13 +302,16 @@ public class ResourceMgrDelegate {
     LOG.info("Killing application " + applicationId);
   }
 
-  public ApplicationMaster getApplicationMaster(ApplicationId appId) 
-    throws YarnRemoteException {
-    GetApplicationMasterRequest request = recordFactory.newRecordInstance(GetApplicationMasterRequest.class);
+
+  public ApplicationReport getApplicationReport(ApplicationId appId)
+      throws YarnRemoteException {
+    GetApplicationReportRequest request = recordFactory
+        .newRecordInstance(GetApplicationReportRequest.class);
     request.setApplicationId(appId);
-    GetApplicationMasterResponse response = applicationsManager.getApplicationMaster(request);
-    ApplicationMaster appMaster = response.getApplicationMaster(); 
-    return appMaster;
+    GetApplicationReportResponse response = applicationsManager
+        .getApplicationReport(request);
+    ApplicationReport applicationReport = response.getApplicationReport();
+    return applicationReport;
   }
 
   public ApplicationId getApplicationId() {

+ 3 - 3
mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/main/java/org/apache/hadoop/mapred/YARNRunner.java

@@ -68,7 +68,7 @@ import org.apache.hadoop.security.token.TokenIdentifier;
 import org.apache.hadoop.yarn.YarnException;
 import org.apache.hadoop.yarn.api.ApplicationConstants;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.LocalResource;
@@ -240,8 +240,8 @@ public class YARNRunner implements ClientProtocol {
     // Submit to ResourceManager
     ApplicationId applicationId = resMgrDelegate.submitApplication(appContext);
     
-    ApplicationMaster appMaster = 
-      resMgrDelegate.getApplicationMaster(applicationId);
+    ApplicationReport appMaster = resMgrDelegate
+        .getApplicationReport(applicationId);
     if (appMaster.getState() == ApplicationState.FAILED || appMaster.getState() ==
       ApplicationState.KILLED) {
       throw RPCUtil.getRemoteException("failed to run job");

+ 18 - 15
mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapred/TestClientRedirect.java

@@ -29,7 +29,6 @@ import org.apache.avro.ipc.Server;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
 import org.apache.hadoop.mapreduce.ClientFactory;
 import org.apache.hadoop.mapreduce.Cluster;
 import org.apache.hadoop.mapreduce.v2.api.MRClientProtocol;
@@ -70,8 +69,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsResponse;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterRequest;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterNodesRequest;
@@ -85,7 +84,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.GetQueueUserAclsInfoResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationStatus;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
@@ -220,22 +219,26 @@ public class TestClientRedirect {
     }
     
     @Override
-    public GetApplicationMasterResponse getApplicationMaster(GetApplicationMasterRequest request) throws YarnRemoteException {
+    public GetApplicationReportResponse getApplicationReport(
+        GetApplicationReportRequest request) throws YarnRemoteException {
       ApplicationId applicationId = request.getApplicationId();
-      ApplicationMaster master = recordFactory.newRecordInstance(ApplicationMaster.class);
-      master.setApplicationId(applicationId);
-      master.setStatus(recordFactory.newRecordInstance(ApplicationStatus.class));
-      master.getStatus().setApplicationId(applicationId);
+      ApplicationReport application = recordFactory
+          .newRecordInstance(ApplicationReport.class);
+      application.setApplicationId(applicationId);
+      application.setStatus(recordFactory
+          .newRecordInstance(ApplicationStatus.class));
+      application.getStatus().setApplicationId(applicationId);
       if (amRunning) {
-        master.setState(ApplicationState.RUNNING);
+        application.setState(ApplicationState.RUNNING);
       } else {
-        master.setState(ApplicationState.COMPLETED);
+        application.setState(ApplicationState.COMPLETED);
       }
       String[] split = AMHOSTADDRESS.split(":");
-      master.setHost(split[0]);
-      master.setRpcPort(Integer.parseInt(split[1]));
-      GetApplicationMasterResponse response = recordFactory.newRecordInstance(GetApplicationMasterResponse.class);
-      response.setApplicationMaster(master);
+      application.setHost(split[0]);
+      application.setRpcPort(Integer.parseInt(split[1]));
+      GetApplicationReportResponse response = recordFactory
+          .newRecordInstance(GetApplicationReportResponse.class);
+      response.setApplicationReport(application);
       return response;
     }
 

+ 2 - 2
mapreduce/mr-client/hadoop-mapreduce-client-jobclient/src/test/java/org/apache/hadoop/mapreduce/v2/TestMRJobsWithHistoryService.java

@@ -116,8 +116,8 @@ public class TestMRJobsWithHistoryService {
     ApplicationId appID = TypeConverter.toYarn(job.getJobID()).getAppId();
     while (true) {
       Thread.sleep(1000);
-      if (mrCluster.getResourceManager().getApplicationsManager()
-          .getApplication(appID).getState().equals(ApplicationState.COMPLETED))
+      if (mrCluster.getResourceManager().getRMContext().getApplications()
+          .get(appID).getState().equals(ApplicationState.COMPLETED))
         break;
     }
     Counters counterHS = job.getCounters();

+ 3 - 3
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/ClientRMProtocol.java

@@ -4,8 +4,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsResponse;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterRequest;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterNodesRequest;
@@ -22,7 +22,7 @@ import org.apache.hadoop.yarn.exceptions.YarnRemoteException;
 
 public interface ClientRMProtocol {
   public GetNewApplicationIdResponse getNewApplicationId(GetNewApplicationIdRequest request) throws YarnRemoteException;
-  public GetApplicationMasterResponse getApplicationMaster(GetApplicationMasterRequest request) throws YarnRemoteException;
+  public GetApplicationReportResponse getApplicationReport(GetApplicationReportRequest request) throws YarnRemoteException;
   public SubmitApplicationResponse submitApplication(SubmitApplicationRequest request) throws YarnRemoteException;
   public FinishApplicationResponse finishApplication(FinishApplicationRequest request) throws YarnRemoteException;
   public GetClusterMetricsResponse getClusterMetrics(GetClusterMetricsRequest request) throws YarnRemoteException;

+ 3 - 3
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetAllApplicationsResponse.java

@@ -2,9 +2,9 @@ package org.apache.hadoop.yarn.api.protocolrecords;
 
 import java.util.List;
 
-import org.apache.hadoop.yarn.api.records.Application;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 
 public interface GetAllApplicationsResponse {
-  List<Application> getApplicationList();
-  void setApplicationList(List<Application> applications);
+  List<ApplicationReport> getApplicationList();
+  void setApplicationList(List<ApplicationReport> applications);
 }

+ 0 - 8
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetApplicationMasterResponse.java

@@ -1,8 +0,0 @@
-package org.apache.hadoop.yarn.api.protocolrecords;
-
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-
-public interface GetApplicationMasterResponse {
-  public abstract ApplicationMaster getApplicationMaster();
-  public abstract void setApplicationMaster(ApplicationMaster applicationMaster);
-}

+ 1 - 1
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetApplicationMasterRequest.java → mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetApplicationReportRequest.java

@@ -2,7 +2,7 @@ package org.apache.hadoop.yarn.api.protocolrecords;
 
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 
-public interface GetApplicationMasterRequest {
+public interface GetApplicationReportRequest {
   public abstract ApplicationId getApplicationId();
   public abstract void setApplicationId(ApplicationId applicationId);
 }

+ 8 - 0
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/GetApplicationReportResponse.java

@@ -0,0 +1,8 @@
+package org.apache.hadoop.yarn.api.protocolrecords;
+
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
+
+public interface GetApplicationReportResponse {
+  public abstract ApplicationReport getApplicationReport();
+  public abstract void setApplicationReport(ApplicationReport ApplicationReport);
+}

+ 18 - 18
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetAllApplicationsResponsePBImpl.java

@@ -5,10 +5,10 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsResponse;
-import org.apache.hadoop.yarn.api.records.Application;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ProtoBase;
-import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationPBImpl;
-import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationProto;
+import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationReportPBImpl;
+import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetAllApplicationsResponseProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetAllApplicationsResponseProtoOrBuilder;
 
@@ -21,7 +21,7 @@ GetAllApplicationsResponse {
   GetAllApplicationsResponseProto.Builder builder = null;
   boolean viaProto = false;
 
-  List<Application> applicationList;
+  List<ApplicationReport> applicationList;
   
   public GetAllApplicationsResponsePBImpl() {
     builder = GetAllApplicationsResponseProto.newBuilder();
@@ -33,13 +33,13 @@ GetAllApplicationsResponse {
   }
 
   @Override
-  public List<Application> getApplicationList() {    
+  public List<ApplicationReport> getApplicationList() {    
     initLocalApplicationsList();
     return this.applicationList;
   }
 
   @Override
-  public void setApplicationList(List<Application> applications) {
+  public void setApplicationList(List<ApplicationReport> applications) {
     maybeInitBuilder();
     if (applications == null) 
       builder.clearApplications();
@@ -81,10 +81,10 @@ GetAllApplicationsResponse {
       return;
     }
     GetAllApplicationsResponseProtoOrBuilder p = viaProto ? proto : builder;
-    List<ApplicationProto> list = p.getApplicationsList();
-    applicationList = new ArrayList<Application>();
+    List<ApplicationReportProto> list = p.getApplicationsList();
+    applicationList = new ArrayList<ApplicationReport>();
 
-    for (ApplicationProto a : list) {
+    for (ApplicationReportProto a : list) {
       applicationList.add(convertFromProtoFormat(a));
     }
   }
@@ -94,12 +94,12 @@ GetAllApplicationsResponse {
     builder.clearApplications();
     if (applicationList == null)
       return;
-    Iterable<ApplicationProto> iterable = new Iterable<ApplicationProto>() {
+    Iterable<ApplicationReportProto> iterable = new Iterable<ApplicationReportProto>() {
       @Override
-      public Iterator<ApplicationProto> iterator() {
-        return new Iterator<ApplicationProto>() {
+      public Iterator<ApplicationReportProto> iterator() {
+        return new Iterator<ApplicationReportProto>() {
 
-          Iterator<Application> iter = applicationList.iterator();
+          Iterator<ApplicationReport> iter = applicationList.iterator();
 
           @Override
           public boolean hasNext() {
@@ -107,7 +107,7 @@ GetAllApplicationsResponse {
           }
 
           @Override
-          public ApplicationProto next() {
+          public ApplicationReportProto next() {
             return convertToProtoFormat(iter.next());
           }
 
@@ -123,12 +123,12 @@ GetAllApplicationsResponse {
     builder.addAllApplications(iterable);
   }
 
-  private ApplicationPBImpl convertFromProtoFormat(ApplicationProto p) {
-    return new ApplicationPBImpl(p);
+  private ApplicationReportPBImpl convertFromProtoFormat(ApplicationReportProto p) {
+    return new ApplicationReportPBImpl(p);
   }
 
-  private ApplicationProto convertToProtoFormat(Application t) {
-    return ((ApplicationPBImpl)t).getProto();
+  private ApplicationReportProto convertToProtoFormat(ApplicationReport t) {
+    return ((ApplicationReportPBImpl)t).getProto();
   }
 
 }

+ 0 - 91
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetApplicationMasterResponsePBImpl.java

@@ -1,91 +0,0 @@
-package org.apache.hadoop.yarn.api.protocolrecords.impl.pb;
-
-
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterResponse;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-import org.apache.hadoop.yarn.api.records.ProtoBase;
-import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationMasterPBImpl;
-import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationMasterProto;
-import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationMasterResponseProto;
-import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationMasterResponseProtoOrBuilder;
-
-
-    
-public class GetApplicationMasterResponsePBImpl extends ProtoBase<GetApplicationMasterResponseProto> implements GetApplicationMasterResponse {
-  GetApplicationMasterResponseProto proto = GetApplicationMasterResponseProto.getDefaultInstance();
-  GetApplicationMasterResponseProto.Builder builder = null;
-  boolean viaProto = false;
-  
-  private ApplicationMaster applicationMaster = null;
-  
-  
-  public GetApplicationMasterResponsePBImpl() {
-    builder = GetApplicationMasterResponseProto.newBuilder();
-  }
-
-  public GetApplicationMasterResponsePBImpl(GetApplicationMasterResponseProto proto) {
-    this.proto = proto;
-    viaProto = true;
-  }
-  
-  public GetApplicationMasterResponseProto getProto() {
-      mergeLocalToProto();
-    proto = viaProto ? proto : builder.build();
-    viaProto = true;
-    return proto;
-  }
-
-  private void mergeLocalToBuilder() {
-    if (this.applicationMaster != null) {
-      builder.setApplicationMaster(convertToProtoFormat(this.applicationMaster));
-    }
-  }
-
-  private void mergeLocalToProto() {
-    if (viaProto) 
-      maybeInitBuilder();
-    mergeLocalToBuilder();
-    proto = builder.build();
-    viaProto = true;
-  }
-
-  private void maybeInitBuilder() {
-    if (viaProto || builder == null) {
-      builder = GetApplicationMasterResponseProto.newBuilder(proto);
-    }
-    viaProto = false;
-  }
-    
-  
-  @Override
-  public ApplicationMaster getApplicationMaster() {
-    GetApplicationMasterResponseProtoOrBuilder p = viaProto ? proto : builder;
-    if (this.applicationMaster != null) {
-      return this.applicationMaster;
-    }
-    if (!p.hasApplicationMaster()) {
-      return null;
-    }
-    this.applicationMaster = convertFromProtoFormat(p.getApplicationMaster());
-    return this.applicationMaster;
-  }
-
-  @Override
-  public void setApplicationMaster(ApplicationMaster applicationMaster) {
-    maybeInitBuilder();
-    if (applicationMaster == null) 
-      builder.clearApplicationMaster();
-    this.applicationMaster = applicationMaster;
-  }
-
-  private ApplicationMasterPBImpl convertFromProtoFormat(ApplicationMasterProto p) {
-    return new ApplicationMasterPBImpl(p);
-  }
-
-  private ApplicationMasterProto convertToProtoFormat(ApplicationMaster t) {
-    return ((ApplicationMasterPBImpl)t).getProto();
-  }
-
-
-
-}  

+ 12 - 12
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetApplicationMasterRequestPBImpl.java → mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetApplicationReportRequestPBImpl.java

@@ -1,34 +1,34 @@
 package org.apache.hadoop.yarn.api.protocolrecords.impl.pb;
 
 
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportRequest;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ProtoBase;
 import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl;
 import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProto;
-import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationMasterRequestProto;
-import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationMasterRequestProtoOrBuilder;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationReportRequestProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationReportRequestProtoOrBuilder;
 
 
     
-public class GetApplicationMasterRequestPBImpl extends ProtoBase<GetApplicationMasterRequestProto> implements GetApplicationMasterRequest {
-  GetApplicationMasterRequestProto proto = GetApplicationMasterRequestProto.getDefaultInstance();
-  GetApplicationMasterRequestProto.Builder builder = null;
+public class GetApplicationReportRequestPBImpl extends ProtoBase<GetApplicationReportRequestProto> implements GetApplicationReportRequest {
+  GetApplicationReportRequestProto proto = GetApplicationReportRequestProto.getDefaultInstance();
+  GetApplicationReportRequestProto.Builder builder = null;
   boolean viaProto = false;
   
   private ApplicationId applicationId = null;
   
   
-  public GetApplicationMasterRequestPBImpl() {
-    builder = GetApplicationMasterRequestProto.newBuilder();
+  public GetApplicationReportRequestPBImpl() {
+    builder = GetApplicationReportRequestProto.newBuilder();
   }
 
-  public GetApplicationMasterRequestPBImpl(GetApplicationMasterRequestProto proto) {
+  public GetApplicationReportRequestPBImpl(GetApplicationReportRequestProto proto) {
     this.proto = proto;
     viaProto = true;
   }
   
-  public GetApplicationMasterRequestProto getProto() {
+  public GetApplicationReportRequestProto getProto() {
       mergeLocalToProto();
     proto = viaProto ? proto : builder.build();
     viaProto = true;
@@ -51,7 +51,7 @@ public class GetApplicationMasterRequestPBImpl extends ProtoBase<GetApplicationM
 
   private void maybeInitBuilder() {
     if (viaProto || builder == null) {
-      builder = GetApplicationMasterRequestProto.newBuilder(proto);
+      builder = GetApplicationReportRequestProto.newBuilder(proto);
     }
     viaProto = false;
   }
@@ -59,7 +59,7 @@ public class GetApplicationMasterRequestPBImpl extends ProtoBase<GetApplicationM
   
   @Override
   public ApplicationId getApplicationId() {
-    GetApplicationMasterRequestProtoOrBuilder p = viaProto ? proto : builder;
+    GetApplicationReportRequestProtoOrBuilder p = viaProto ? proto : builder;
     if (this.applicationId != null) {
       return this.applicationId;
     }

+ 91 - 0
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/protocolrecords/impl/pb/GetApplicationReportResponsePBImpl.java

@@ -0,0 +1,91 @@
+package org.apache.hadoop.yarn.api.protocolrecords.impl.pb;
+
+
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportResponse;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
+import org.apache.hadoop.yarn.api.records.ProtoBase;
+import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationReportPBImpl;
+import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationReportResponseProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationReportResponseProtoOrBuilder;
+
+
+    
+public class GetApplicationReportResponsePBImpl extends ProtoBase<GetApplicationReportResponseProto> implements GetApplicationReportResponse {
+  GetApplicationReportResponseProto proto = GetApplicationReportResponseProto.getDefaultInstance();
+  GetApplicationReportResponseProto.Builder builder = null;
+  boolean viaProto = false;
+  
+  private ApplicationReport applicationReport = null;
+  
+  
+  public GetApplicationReportResponsePBImpl() {
+    builder = GetApplicationReportResponseProto.newBuilder();
+  }
+
+  public GetApplicationReportResponsePBImpl(GetApplicationReportResponseProto proto) {
+    this.proto = proto;
+    viaProto = true;
+  }
+  
+  public GetApplicationReportResponseProto getProto() {
+      mergeLocalToProto();
+    proto = viaProto ? proto : builder.build();
+    viaProto = true;
+    return proto;
+  }
+
+  private void mergeLocalToBuilder() {
+    if (this.applicationReport != null) {
+      builder.setApplicationReport(convertToProtoFormat(this.applicationReport));
+    }
+  }
+
+  private void mergeLocalToProto() {
+    if (viaProto) 
+      maybeInitBuilder();
+    mergeLocalToBuilder();
+    proto = builder.build();
+    viaProto = true;
+  }
+
+  private void maybeInitBuilder() {
+    if (viaProto || builder == null) {
+      builder = GetApplicationReportResponseProto.newBuilder(proto);
+    }
+    viaProto = false;
+  }
+    
+  
+  @Override
+  public ApplicationReport getApplicationReport() {
+    GetApplicationReportResponseProtoOrBuilder p = viaProto ? proto : builder;
+    if (this.applicationReport != null) {
+      return this.applicationReport;
+    }
+    if (!p.hasApplicationReport()) {
+      return null;
+    }
+    this.applicationReport = convertFromProtoFormat(p.getApplicationReport());
+    return this.applicationReport;
+  }
+
+  @Override
+  public void setApplicationReport(ApplicationReport applicationMaster) {
+    maybeInitBuilder();
+    if (applicationMaster == null) 
+      builder.clearApplicationReport();
+    this.applicationReport = applicationMaster;
+  }
+
+  private ApplicationReportPBImpl convertFromProtoFormat(ApplicationReportProto p) {
+    return new ApplicationReportPBImpl(p);
+  }
+
+  private ApplicationReportProto convertToProtoFormat(ApplicationReport t) {
+    return ((ApplicationReportPBImpl)t).getProto();
+  }
+
+
+
+}  

+ 10 - 1
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/Application.java → mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationReport.java

@@ -18,7 +18,7 @@
 
 package org.apache.hadoop.yarn.api.records;
 
-public interface Application {
+public interface ApplicationReport {
 
   ApplicationId getApplicationId();
   void setApplicationId(ApplicationId applicationId);
@@ -32,6 +32,15 @@ public interface Application {
   String getName();
   void setName(String name);
 
+  String getHost();
+  void setHost(String host);
+
+  int getRpcPort();
+  void setRpcPort(int rpcPort);
+
+  String getClientToken();
+  void setClientToken(String clientToken);
+
   ApplicationStatus getStatus();
   void setStatus(ApplicationStatus status);
 

+ 2 - 2
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/QueueInfo.java

@@ -18,8 +18,8 @@ public interface QueueInfo {
   List<QueueInfo> getChildQueues();
   void setChildQueues(List<QueueInfo> childQueues);
   
-  List<Application> getApplications();
-  void setApplications(List<Application> applications);
+  List<ApplicationReport> getApplications();
+  void setApplications(List<ApplicationReport> applications);
   
   QueueState getQueueState();
   void setQueueState(QueueState queueState);

+ 72 - 21
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationPBImpl.java → mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationReportPBImpl.java

@@ -1,34 +1,35 @@
 package org.apache.hadoop.yarn.api.records.impl.pb;
 
-import org.apache.hadoop.yarn.api.records.Application;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationStatus;
 import org.apache.hadoop.yarn.api.records.Container;
 import org.apache.hadoop.yarn.api.records.ProtoBase;
 import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProto;
-import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationProto;
-import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationProtoOrBuilder;
+import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProtoOrBuilder;
+import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto;
+import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProtoOrBuilder;
 import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationStateProto;
 import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationStatusProto;
 import org.apache.hadoop.yarn.proto.YarnProtos.ContainerProto;
 import org.apache.hadoop.yarn.util.ProtoUtils;
 
-public class ApplicationPBImpl extends ProtoBase<ApplicationProto> 
-implements Application {
-  ApplicationProto proto = ApplicationProto.getDefaultInstance();
-  ApplicationProto.Builder builder = null;
+public class ApplicationReportPBImpl extends ProtoBase<ApplicationReportProto> 
+implements ApplicationReport {
+  ApplicationReportProto proto = ApplicationReportProto.getDefaultInstance();
+  ApplicationReportProto.Builder builder = null;
   boolean viaProto = false;
 
   ApplicationId applicationId;
   ApplicationStatus status;
   Container masterContainer = null;
 
-  public ApplicationPBImpl() {
-    builder = ApplicationProto.newBuilder();
+  public ApplicationReportPBImpl() {
+    builder = ApplicationReportProto.newBuilder();
   }
   
-  public ApplicationPBImpl(ApplicationProto proto) {
+  public ApplicationReportPBImpl(ApplicationReportProto proto) {
     this.proto = proto;
     viaProto = true;
   }
@@ -39,7 +40,7 @@ implements Application {
       return this.applicationId;
     }
 
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasApplicationId()) {
       return null;
     }
@@ -53,7 +54,7 @@ implements Application {
       return this.masterContainer;
     }
 
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasMasterContainer()) {
       return null;
     }
@@ -63,7 +64,7 @@ implements Application {
 
   @Override
   public String getTrackingUrl() {
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasTrackingUrl()) {
       return null;
     }
@@ -72,7 +73,7 @@ implements Application {
 
   @Override
   public String getName() {
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasName()) {
       return null;
     }
@@ -81,7 +82,7 @@ implements Application {
 
   @Override
   public String getQueue() {
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasQueue()) {
       return null;
     }
@@ -90,20 +91,44 @@ implements Application {
 
   @Override
   public ApplicationState getState() {
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasState()) {
       return null;
     }
     return convertFromProtoFormat(p.getState());
   }
 
+  @Override
+  public String getHost() {
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasHost()) {
+      return null;
+    }
+    return (p.getHost());
+  }
+
+  @Override
+  public int getRpcPort() {
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
+    return (p.getRpcPort());
+  }
+
+  @Override
+  public String getClientToken() {
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
+    if (!p.hasClientToken()) {
+      return null;
+    }
+    return (p.getClientToken());
+  }
+
   @Override
   public ApplicationStatus getStatus() {
     if (this.status != null) {
       return this.status;
     }
 
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasStatus()) {
       return null;
     }
@@ -113,7 +138,7 @@ implements Application {
 
   @Override
   public String getUser() {
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasUser()) {
       return null;
     }
@@ -123,7 +148,7 @@ implements Application {
 
   @Override
   public String getDiagnostics() {
-    ApplicationProtoOrBuilder p = viaProto ? proto : builder;
+    ApplicationReportProtoOrBuilder p = viaProto ? proto : builder;
     if (!p.hasDiagnostics()) {
       return null;
     }
@@ -186,6 +211,32 @@ implements Application {
     builder.setState(convertToProtoFormat(state));
   }
 
+  @Override
+  public void setHost(String host) {
+    maybeInitBuilder();
+    if (host == null) {
+      builder.clearHost();
+      return;
+    }
+    builder.setHost((host));
+  }
+
+  @Override
+  public void setRpcPort(int rpcPort) {
+    maybeInitBuilder();
+    builder.setRpcPort((rpcPort));
+  }
+
+  @Override
+  public void setClientToken(String clientToken) {
+    maybeInitBuilder();
+    if (clientToken == null) {
+      builder.clearClientToken();
+      return;
+    }
+    builder.setClientToken((clientToken));
+  }
+
   @Override
   public void setStatus(ApplicationStatus status) {
     maybeInitBuilder();
@@ -215,7 +266,7 @@ implements Application {
   }
 
   @Override
-  public ApplicationProto getProto() {
+  public ApplicationReportProto getProto() {
     mergeLocalToProto();
     proto = viaProto ? proto : builder.build();
     viaProto = true;
@@ -245,7 +296,7 @@ implements Application {
 
   private void maybeInitBuilder() {
     if (viaProto || builder == null) {
-      builder = ApplicationProto.newBuilder(proto);
+      builder = ApplicationReportProto.newBuilder(proto);
     }
     viaProto = false;
   }

+ 17 - 17
mapreduce/yarn/yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/QueueInfoPBImpl.java

@@ -4,11 +4,11 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.hadoop.yarn.api.records.Application;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ProtoBase;
 import org.apache.hadoop.yarn.api.records.QueueInfo;
 import org.apache.hadoop.yarn.api.records.QueueState;
-import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationProto;
+import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto;
 import org.apache.hadoop.yarn.proto.YarnProtos.QueueInfoProto;
 import org.apache.hadoop.yarn.proto.YarnProtos.QueueInfoProtoOrBuilder;
 import org.apache.hadoop.yarn.proto.YarnProtos.QueueStateProto;
@@ -21,7 +21,7 @@ public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements
   QueueInfoProto.Builder builder = null;
   boolean viaProto = false;
 
-  List<Application> applicationsList;
+  List<ApplicationReport> applicationsList;
   List<QueueInfo> childQueuesList;
   
   public QueueInfoPBImpl() {
@@ -34,7 +34,7 @@ public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements
   }
 
   @Override
-  public List<Application> getApplications() {
+  public List<ApplicationReport> getApplications() {
     initLocalApplicationsList();
     return this.applicationsList;
   }
@@ -79,7 +79,7 @@ public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements
   }
 
   @Override
-  public void setApplications(List<Application> applications) {
+  public void setApplications(List<ApplicationReport> applications) {
     if (applications == null) {
       builder.clearApplications();
     }
@@ -144,10 +144,10 @@ public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements
       return;
     }
     QueueInfoProtoOrBuilder p = viaProto ? proto : builder;
-    List<ApplicationProto> list = p.getApplicationsList();
-    applicationsList = new ArrayList<Application>();
+    List<ApplicationReportProto> list = p.getApplicationsList();
+    applicationsList = new ArrayList<ApplicationReport>();
 
-    for (ApplicationProto a : list) {
+    for (ApplicationReportProto a : list) {
       applicationsList.add(convertFromProtoFormat(a));
     }
   }
@@ -157,12 +157,12 @@ public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements
     builder.clearApplications();
     if (applicationsList == null)
       return;
-    Iterable<ApplicationProto> iterable = new Iterable<ApplicationProto>() {
+    Iterable<ApplicationReportProto> iterable = new Iterable<ApplicationReportProto>() {
       @Override
-      public Iterator<ApplicationProto> iterator() {
-        return new Iterator<ApplicationProto>() {
+      public Iterator<ApplicationReportProto> iterator() {
+        return new Iterator<ApplicationReportProto>() {
   
-          Iterator<Application> iter = applicationsList.iterator();
+          Iterator<ApplicationReport> iter = applicationsList.iterator();
   
           @Override
           public boolean hasNext() {
@@ -170,7 +170,7 @@ public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements
           }
   
           @Override
-          public ApplicationProto next() {
+          public ApplicationReportProto next() {
             return convertToProtoFormat(iter.next());
           }
   
@@ -258,12 +258,12 @@ public class QueueInfoPBImpl extends ProtoBase<QueueInfoProto> implements
   }
 
 
-  private ApplicationPBImpl convertFromProtoFormat(ApplicationProto a) {
-    return new ApplicationPBImpl(a);
+  private ApplicationReportPBImpl convertFromProtoFormat(ApplicationReportProto a) {
+    return new ApplicationReportPBImpl(a);
   }
 
-  private ApplicationProto convertToProtoFormat(Application t) {
-    return ((ApplicationPBImpl)t).getProto();
+  private ApplicationReportProto convertToProtoFormat(ApplicationReport t) {
+    return ((ApplicationReportPBImpl)t).getProto();
   }
 
   private QueueInfoPBImpl convertFromProtoFormat(QueueInfoProto a) {

+ 1 - 1
mapreduce/yarn/yarn-api/src/main/proto/client_RM_protocol.proto

@@ -7,7 +7,7 @@ import "yarn_service_protos.proto";
 
 service ClientRMProtocolService {
   rpc getNewApplicationId (GetNewApplicationIdRequestProto) returns (GetNewApplicationIdResponseProto);
-  rpc getApplicationMaster (GetApplicationMasterRequestProto) returns (GetApplicationMasterResponseProto);
+  rpc getApplicationReport (GetApplicationReportRequestProto) returns (GetApplicationReportResponseProto);
   rpc submitApplication (SubmitApplicationRequestProto) returns (SubmitApplicationResponseProto);
   rpc finishApplication (FinishApplicationRequestProto) returns (FinishApplicationResponseProto);
   rpc getClusterMetrics (GetClusterMetricsRequestProto) returns (GetClusterMetricsResponseProto);

+ 10 - 7
mapreduce/yarn/yarn-api/src/main/proto/yarn_protos.proto

@@ -107,16 +107,19 @@ message LocalResourceProto {
   optional LocalResourceVisibilityProto visibility= 5;
 }
 
-message ApplicationProto {
+message ApplicationReportProto {
   optional ApplicationIdProto applicationId = 1;
   optional string user = 2;
   optional string queue = 3;
   optional string name = 4;
-  optional ApplicationStatusProto status = 5;
-  optional ApplicationStateProto state = 6;
-  optional ContainerProto masterContainer = 7;
-  optional string trackingUrl = 8;
-  optional string diagnostics = 9 [default = "N/A"];
+  optional string host = 5;
+  optional int32 rpc_port = 6;
+  optional string client_token = 7;
+  optional ApplicationStatusProto status = 8;
+  optional ApplicationStateProto state = 9;
+  optional ContainerProto masterContainer = 10;
+  optional string trackingUrl = 11;
+  optional string diagnostics = 12 [default = "N/A"];
 }
 
 message NodeIdProto {
@@ -186,7 +189,7 @@ message QueueInfoProto {
   optional float currentCapacity = 4;
   optional QueueStateProto state = 5;
   repeated QueueInfoProto childQueues = 6;
-  repeated ApplicationProto applications = 7;
+  repeated ApplicationReportProto applications = 7;
 }
 
 enum QueueACLProto {

+ 4 - 4
mapreduce/yarn/yarn-api/src/main/proto/yarn_service_protos.proto

@@ -47,12 +47,12 @@ message GetNewApplicationIdResponseProto {
   optional ApplicationIdProto application_id = 1;
 }
 
-message GetApplicationMasterRequestProto {
+message GetApplicationReportRequestProto {
   optional ApplicationIdProto application_id = 1;
 }
 
-message GetApplicationMasterResponseProto {
-  optional ApplicationMasterProto application_master = 1;
+message GetApplicationReportResponseProto {
+  optional ApplicationReportProto application_report = 1;
 }
 
 message SubmitApplicationRequestProto {
@@ -80,7 +80,7 @@ message GetAllApplicationsRequestProto {
 }
 
 message GetAllApplicationsResponseProto {
-  repeated ApplicationProto applications = 1;
+  repeated ApplicationReportProto applications = 1;
 }
 
 message GetClusterNodesRequestProto {

+ 9 - 9
mapreduce/yarn/yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/client/ClientRMProtocolPBClientImpl.java

@@ -11,8 +11,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsResponse;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterRequest;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterNodesRequest;
@@ -29,8 +29,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.FinishApplicationReque
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.FinishApplicationResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetAllApplicationsRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetAllApplicationsResponsePBImpl;
-import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationMasterRequestPBImpl;
-import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationMasterResponsePBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationReportRequestPBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationReportResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetClusterMetricsRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetClusterMetricsResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetClusterNodesRequestPBImpl;
@@ -48,7 +48,7 @@ import org.apache.hadoop.yarn.ipc.ProtoOverHadoopRpcEngine;
 import org.apache.hadoop.yarn.proto.ClientRMProtocol.ClientRMProtocolService;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.FinishApplicationRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetAllApplicationsRequestProto;
-import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationMasterRequestProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationReportRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetClusterMetricsRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetClusterNodesRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetNewApplicationIdRequestProto;
@@ -87,11 +87,11 @@ public class ClientRMProtocolPBClientImpl implements ClientRMProtocol {
   }
 
   @Override
-  public GetApplicationMasterResponse getApplicationMaster(
-      GetApplicationMasterRequest request) throws YarnRemoteException {
-    GetApplicationMasterRequestProto requestProto = ((GetApplicationMasterRequestPBImpl)request).getProto();
+  public GetApplicationReportResponse getApplicationReport(
+      GetApplicationReportRequest request) throws YarnRemoteException {
+    GetApplicationReportRequestProto requestProto = ((GetApplicationReportRequestPBImpl)request).getProto();
     try {
-      return new GetApplicationMasterResponsePBImpl(proxy.getApplicationMaster(null, requestProto));
+      return new GetApplicationReportResponsePBImpl(proxy.getApplicationReport(null, requestProto));
     } catch (ServiceException e) {
       if (e.getCause() instanceof YarnRemoteException) {
         throw (YarnRemoteException)e.getCause();

+ 10 - 10
mapreduce/yarn/yarn-common/src/main/java/org/apache/hadoop/yarn/api/impl/pb/service/ClientRMProtocolPBServiceImpl.java

@@ -3,7 +3,7 @@ package org.apache.hadoop.yarn.api.impl.pb.service;
 import org.apache.hadoop.yarn.api.ClientRMProtocol;
 import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsResponse;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterNodesResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationIdResponse;
@@ -14,8 +14,8 @@ import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.FinishApplicationReque
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.FinishApplicationResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetAllApplicationsRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetAllApplicationsResponsePBImpl;
-import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationMasterRequestPBImpl;
-import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationMasterResponsePBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationReportRequestPBImpl;
+import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetApplicationReportResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetClusterMetricsRequestPBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetClusterMetricsResponsePBImpl;
 import org.apache.hadoop.yarn.api.protocolrecords.impl.pb.GetClusterNodesRequestPBImpl;
@@ -34,8 +34,8 @@ import org.apache.hadoop.yarn.proto.YarnServiceProtos.FinishApplicationRequestPr
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.FinishApplicationResponseProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetAllApplicationsRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetAllApplicationsResponseProto;
-import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationMasterRequestProto;
-import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationMasterResponseProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationReportRequestProto;
+import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetApplicationReportResponseProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetClusterMetricsRequestProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetClusterMetricsResponseProto;
 import org.apache.hadoop.yarn.proto.YarnServiceProtos.GetClusterNodesRequestProto;
@@ -73,13 +73,13 @@ public class ClientRMProtocolPBServiceImpl implements BlockingInterface {
   }
 
   @Override
-  public GetApplicationMasterResponseProto getApplicationMaster(
-      RpcController arg0, GetApplicationMasterRequestProto proto)
+  public GetApplicationReportResponseProto getApplicationReport(
+      RpcController arg0, GetApplicationReportRequestProto proto)
       throws ServiceException {
-    GetApplicationMasterRequestPBImpl request = new GetApplicationMasterRequestPBImpl(proto);
+    GetApplicationReportRequestPBImpl request = new GetApplicationReportRequestPBImpl(proto);
     try {
-      GetApplicationMasterResponse response = real.getApplicationMaster(request);
-      return ((GetApplicationMasterResponsePBImpl)response).getProto();
+      GetApplicationReportResponse response = real.getApplicationReport(request);
+      return ((GetApplicationReportResponsePBImpl)response).getProto();
     } catch (YarnRemoteException e) {
       throw new ServiceException(e);
     }

+ 35 - 5
mapreduce/yarn/yarn-common/src/test/java/org/apache/hadoop/yarn/MockApps.java

@@ -24,7 +24,7 @@ import com.google.common.collect.Lists;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.hadoop.yarn.api.records.Application;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationStatus;
@@ -65,15 +65,15 @@ public class MockApps {
     }
   }
 
-  public static List<Application> genApps(int n) {
-    List<Application> list = Lists.newArrayList();
+  public static List<ApplicationReport> genApps(int n) {
+    List<ApplicationReport> list = Lists.newArrayList();
     for (int i = 0; i < n; ++i) {
       list.add(newApp(i));
     }
     return list;
   }
 
-  public static Application newApp(int i) {
+  public static ApplicationReport newApp(int i) {
     final ApplicationId id = newAppID(i);
     final ApplicationStatus status = newAppStatus();
     final ApplicationState state = newAppState();
@@ -81,7 +81,7 @@ public class MockApps {
     final String name = newAppName();
     final String queue = newQueue();
     final Container masterContainer = null;
-    return new Application() {
+    return new ApplicationReport() {
       @Override public ApplicationId getApplicationId() { return id; }
       @Override public String getUser() { return user; }
       @Override public String getName() { return name; }
@@ -142,6 +142,36 @@ public class MockApps {
         // TODO Auto-generated method stub
         
       }
+      @Override
+      public String getHost() {
+        // TODO Auto-generated method stub
+        return null;
+      }
+      @Override
+      public void setHost(String host) {
+        // TODO Auto-generated method stub
+        
+      }
+      @Override
+      public int getRpcPort() {
+        // TODO Auto-generated method stub
+        return 0;
+      }
+      @Override
+      public void setRpcPort(int rpcPort) {
+        // TODO Auto-generated method stub
+        
+      }
+      @Override
+      public String getClientToken() {
+        // TODO Auto-generated method stub
+        return null;
+      }
+      @Override
+      public void setClientToken(String clientToken) {
+        // TODO Auto-generated method stub
+        
+      }
     };
   }
 

+ 28 - 25
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterService.java

@@ -56,9 +56,11 @@ import org.apache.hadoop.yarn.ipc.YarnRPC;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
 import org.apache.hadoop.yarn.security.SchedulerSecurityInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationMasterHandler;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMFinishEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMRegistrationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMStatusUpdateEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Allocation;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
 import org.apache.hadoop.yarn.service.AbstractService;
@@ -67,7 +69,6 @@ import org.apache.hadoop.yarn.service.AbstractService;
 public class ApplicationMasterService extends AbstractService implements 
 AMRMProtocol, EventHandler<ASMEvent<ApplicationTrackerEventType>> {
   private static final Log LOG = LogFactory.getLog(ApplicationMasterService.class);
-  private ApplicationMasterHandler applicationsManager;
   private YarnScheduler rScheduler;
   private ApplicationTokenSecretManager appTokenManager;
   private InetSocketAddress masterServiceAddress;
@@ -76,17 +77,17 @@ AMRMProtocol, EventHandler<ASMEvent<ApplicationTrackerEventType>> {
   private final Map<ApplicationId, AMResponse> responseMap =
       new HashMap<ApplicationId, AMResponse>();
   private final AMResponse reboot = recordFactory.newRecordInstance(AMResponse.class);
-  private final RMContext asmContext;
+  private final RMContext context;
   
-  public ApplicationMasterService(ApplicationTokenSecretManager appTokenManager,
-      ApplicationMasterHandler applicationsManager, YarnScheduler scheduler, RMContext asmContext) {
+  public ApplicationMasterService(
+      ApplicationTokenSecretManager appTokenManager, YarnScheduler scheduler,
+      RMContext asmContext) {
     super(ApplicationMasterService.class.getName());
     this.appTokenManager = appTokenManager;
-    this.applicationsManager = applicationsManager;
     this.rScheduler = scheduler;
     this.reboot.setReboot(true);
 //    this.reboot.containers = new ArrayList<Container>();
-    this.asmContext = asmContext;
+    this.context = asmContext;
   }
 
   @Override
@@ -95,7 +96,7 @@ AMRMProtocol, EventHandler<ASMEvent<ApplicationTrackerEventType>> {
       conf.get(YarnConfiguration.SCHEDULER_ADDRESS,
           YarnConfiguration.DEFAULT_SCHEDULER_BIND_ADDRESS);
     masterServiceAddress =  NetUtils.createSocketAddr(bindAddress);
-    this.asmContext.getDispatcher().register(ApplicationTrackerEventType.class, this);
+    this.context.getDispatcher().register(ApplicationTrackerEventType.class, this);
     super.init(conf);
   }
 
@@ -118,13 +119,11 @@ AMRMProtocol, EventHandler<ASMEvent<ApplicationTrackerEventType>> {
   @Override
   public RegisterApplicationMasterResponse registerApplicationMaster(RegisterApplicationMasterRequest request) throws YarnRemoteException {
     // TODO: What if duplicate register due to lost RPCs
+
     ApplicationMaster applicationMaster = request.getApplicationMaster();
-    try {
-      applicationsManager.registerApplicationMaster(applicationMaster);
-    } catch(IOException ie) {
-      LOG.info("Exception registering application ", ie);
-      throw RPCUtil.getRemoteException(ie);
-    }
+    LOG.info("AM registration " + applicationMaster.getApplicationId());
+    context.getDispatcher().getEventHandler().handle(
+        new AMRegistrationEvent(applicationMaster));
     
     // Pick up min/max resource from scheduler...
     RegisterApplicationMasterResponse response = 
@@ -137,16 +136,16 @@ AMRMProtocol, EventHandler<ASMEvent<ApplicationTrackerEventType>> {
   }
 
   @Override
-  public FinishApplicationMasterResponse finishApplicationMaster(FinishApplicationMasterRequest request) throws YarnRemoteException {
+  public FinishApplicationMasterResponse finishApplicationMaster(
+      FinishApplicationMasterRequest request) throws YarnRemoteException {
     // TODO: What if duplicate finish due to lost RPCs
     ApplicationMaster applicationMaster = request.getApplicationMaster();
-    try {
-      applicationsManager.finishApplicationMaster(applicationMaster);
-    } catch(IOException ie) {
-      LOG.info("Exception finishing application", ie);
-      throw RPCUtil.getRemoteException(ie);
-    }
-    FinishApplicationMasterResponse response = recordFactory.newRecordInstance(FinishApplicationMasterResponse.class);
+    context.getDispatcher().getEventHandler().handle(
+        new AMFinishEvent(applicationMaster.getApplicationId(),
+            applicationMaster.getState(), applicationMaster.getTrackingUrl(),
+            applicationMaster.getDiagnostics()));
+    FinishApplicationMasterResponse response = recordFactory
+        .newRecordInstance(FinishApplicationMasterResponse.class);
     return response;
   }
 
@@ -180,7 +179,11 @@ AMRMProtocol, EventHandler<ASMEvent<ApplicationTrackerEventType>> {
           allocateResponse.setAMResponse(reboot);
           return allocateResponse;
         }
-        applicationsManager.applicationHeartbeat(status);
+
+        // Send the heart-beat to the application.
+        context.getDispatcher().getEventHandler().handle(
+            new AMStatusUpdateEvent(status));
+
         Allocation allocation = 
           rScheduler.allocate(status.getApplicationId(), ask, release); 
         AMResponse  response = recordFactory.newRecordInstance(AMResponse.class);
@@ -208,7 +211,7 @@ AMRMProtocol, EventHandler<ASMEvent<ApplicationTrackerEventType>> {
   @Override
   public void handle(ASMEvent<ApplicationTrackerEventType> appEvent) {
     ApplicationTrackerEventType event = appEvent.getType();
-    ApplicationId id = appEvent.getAppContext().getApplicationID();
+    ApplicationId id = appEvent.getApplication().getApplicationID();
     synchronized(responseMap) {
       switch (event) {
       case ADD:

+ 10 - 13
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterHandler.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationsManager.java

@@ -16,27 +16,24 @@
 * limitations under the License.
 */
 
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
-
-import java.io.IOException;
+package org.apache.hadoop.yarn.server.resourcemanager;
 
 import org.apache.hadoop.classification.InterfaceAudience.Private;
 import org.apache.hadoop.classification.InterfaceStability.Evolving;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-import org.apache.hadoop.yarn.api.records.ApplicationStatus;
+import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AMLivelinessMonitor;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.Recoverable;
+import org.apache.hadoop.yarn.service.Service;
 
 /**
- * Interface the application master use for application master status
- * and registeration.
+ * This interface defines the interface for ApplicationsManager.
  */
 @Private
 @Evolving
-public interface ApplicationMasterHandler  {
-  void registerApplicationMaster(ApplicationMaster applicationMaster)
-  throws IOException ;
+public interface ApplicationsManager extends Recoverable, Service{
+
+  AMLivelinessMonitor getAmLivelinessMonitor();
 
-  void applicationHeartbeat(ApplicationStatus status) throws IOException;
+  ClientToAMSecretManager getClientToAMSecretManager();
 
-  void finishApplicationMaster(ApplicationMaster applicationMaster)
-  throws IOException;
 }

+ 201 - 29
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClientRMService.java

@@ -20,8 +20,11 @@ package org.apache.hadoop.yarn.server.resourcemanager;
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.avro.ipc.Server;
 import org.apache.commons.logging.Log;
@@ -31,13 +34,15 @@ import org.apache.hadoop.fs.CommonConfigurationKeys;
 import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.security.SecurityInfo;
 import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.security.authorize.AccessControlList;
+import org.apache.hadoop.security.token.Token;
 import org.apache.hadoop.yarn.api.ClientRMProtocol;
 import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.FinishApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetAllApplicationsResponse;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterRequest;
-import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationMasterResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationReportResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterMetricsResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.GetClusterNodesRequest;
@@ -51,7 +56,10 @@ import org.apache.hadoop.yarn.api.protocolrecords.GetQueueUserAclsInfoResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ApplicationMaster;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
+import org.apache.hadoop.yarn.api.records.Container;
 import org.apache.hadoop.yarn.api.records.NodeManagerInfo;
 import org.apache.hadoop.yarn.api.records.QueueInfo;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
@@ -60,11 +68,22 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.ipc.RPCUtil;
 import org.apache.hadoop.yarn.ipc.YarnRPC;
+import org.apache.hadoop.yarn.security.ApplicationTokenIdentifier;
 import org.apache.hadoop.yarn.security.client.ClientRMSecurityInfo;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationsManager;
-import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.NodeInfo;
+import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AMLivelinessMonitor;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationImpl;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.application.ApplicationACL;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.application.ApplicationACLsManager;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.ClusterTracker;
+import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.NodeInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
 import org.apache.hadoop.yarn.service.AbstractService;
 
 
@@ -72,24 +91,36 @@ import org.apache.hadoop.yarn.service.AbstractService;
  * The client interface to the Resource Manager. This module handles all the rpc
  * interfaces to the resource manager from the client.
  */
-public class ClientRMService extends AbstractService implements ClientRMProtocol {
+public class ClientRMService extends AbstractService implements
+    ClientRMProtocol {
   private static final Log LOG = LogFactory.getLog(ClientRMService.class);
-  
+
+  final private AtomicInteger applicationCounter = new AtomicInteger(0);
+
   final private ClusterTracker clusterInfo;
-  final private ApplicationsManager applicationsManager;
-  final private ResourceScheduler scheduler;
-  
+  final private YarnScheduler scheduler;
+  final private RMContext rmContext;
+  private final ClientToAMSecretManager clientToAMSecretManager;
+  private final AMLivelinessMonitor amLivelinessMonitor;
+
   private String clientServiceBindAddress;
   private Server server;
   private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
   InetSocketAddress clientBindAddress;
+
+  private  ApplicationACLsManager aclsManager;
+  private Map<ApplicationACL, AccessControlList> applicationACLs;
   
-  public ClientRMService(ApplicationsManager applicationsManager, 
-        ClusterTracker clusterInfo, ResourceScheduler scheduler) {
+  public ClientRMService(RMContext rmContext,
+      AMLivelinessMonitor amLivelinessMonitor,
+      ClientToAMSecretManager clientToAMSecretManager,
+      ClusterTracker clusterInfo, YarnScheduler scheduler) {
     super(ClientRMService.class.getName());
     this.clusterInfo = clusterInfo;
-    this.applicationsManager = applicationsManager;
     this.scheduler = scheduler;
+    this.rmContext = rmContext;
+    this.amLivelinessMonitor = amLivelinessMonitor;
+    this.clientToAMSecretManager = clientToAMSecretManager;
   }
   
   @Override
@@ -99,6 +130,10 @@ public class ClientRMService extends AbstractService implements ClientRMProtocol
           YarnConfiguration.DEFAULT_APPSMANAGER_BIND_ADDRESS);
     clientBindAddress =
       NetUtils.createSocketAddr(clientServiceBindAddress);
+
+    this.aclsManager = new ApplicationACLsManager(conf);
+    this.applicationACLs = aclsManager.constructApplicationACLs(conf);
+
     super.init(conf);
   }
   
@@ -121,43 +156,172 @@ public class ClientRMService extends AbstractService implements ClientRMProtocol
     super.start();
   }
 
+  private ApplicationReport createApplicationReport(Application application,
+      String user, String queue, String name, Container masterContainer) {
+    ApplicationMaster am = application.getMaster();
+    ApplicationReport applicationReport = 
+      recordFactory.newRecordInstance(ApplicationReport.class);
+    applicationReport.setApplicationId(am.getApplicationId());
+    applicationReport.setMasterContainer(masterContainer);
+    applicationReport.setHost(am.getHost());
+    applicationReport.setRpcPort(am.getRpcPort());
+    applicationReport.setClientToken(am.getClientToken());
+    applicationReport.setTrackingUrl(am.getTrackingUrl());
+    applicationReport.setDiagnostics(am.getDiagnostics());
+    applicationReport.setName(name);
+    applicationReport.setQueue(queue);
+    applicationReport.setState(am.getState());
+    applicationReport.setStatus(am.getStatus());
+    applicationReport.setUser(user);
+    return applicationReport;
+  }
+
+  /**
+   * check if the calling user has the access to application information.
+   * @param applicationId
+   * @param callerUGI
+   * @param owner
+   * @param appACL
+   * @return
+   */
+  private boolean checkAccess(UserGroupInformation callerUGI, String owner, ApplicationACL appACL) {
+      if (!UserGroupInformation.isSecurityEnabled()) {
+        return true;
+      }
+      AccessControlList applicationACL = applicationACLs.get(appACL);
+      return aclsManager.checkAccess(callerUGI, appACL, owner, applicationACL);
+  }
+
+  public ApplicationId getNewApplicationId() {
+    ApplicationId applicationId = org.apache.hadoop.yarn.util.BuilderUtils
+        .newApplicationId(recordFactory, ResourceManager.clusterTimeStamp,
+            applicationCounter.incrementAndGet());
+    LOG.info("Allocated new applicationId: " + applicationId.getId());
+    return applicationId;
+  }
+
   @Override
-  public GetNewApplicationIdResponse getNewApplicationId(GetNewApplicationIdRequest request) throws YarnRemoteException {
-    GetNewApplicationIdResponse response = recordFactory.newRecordInstance(GetNewApplicationIdResponse.class);
-    response.setApplicationId(applicationsManager.getNewApplicationID());
+  public GetNewApplicationIdResponse getNewApplicationId(
+      GetNewApplicationIdRequest request) throws YarnRemoteException {
+    GetNewApplicationIdResponse response = recordFactory
+        .newRecordInstance(GetNewApplicationIdResponse.class);
+    response.setApplicationId(getNewApplicationId());
     return response;
   }
   
   @Override
-  public GetApplicationMasterResponse getApplicationMaster(GetApplicationMasterRequest request) throws YarnRemoteException {
+  public GetApplicationReportResponse getApplicationReport(
+      GetApplicationReportRequest request) throws YarnRemoteException {
     ApplicationId applicationId = request.getApplicationId();
-    GetApplicationMasterResponse response = recordFactory.newRecordInstance(GetApplicationMasterResponse.class);
-    response.setApplicationMaster(applicationsManager.getApplicationMaster(applicationId));
+    Application application = rmContext.getApplications().get(applicationId);
+    ApplicationReport report = (application == null) ? null
+        : createApplicationReport(application, application.getUser(),
+            application.getQueue(), application.getName(), application
+                .getMasterContainer());
+
+    GetApplicationReportResponse response = recordFactory
+        .newRecordInstance(GetApplicationReportResponse.class);
+    response.setApplicationReport(report);
     return response;
   }
 
-  public SubmitApplicationResponse submitApplication(SubmitApplicationRequest request) throws YarnRemoteException {
-    ApplicationSubmissionContext context = request.getApplicationSubmissionContext();
+  public SubmitApplicationResponse submitApplication(
+      SubmitApplicationRequest request) throws YarnRemoteException {
+    ApplicationSubmissionContext submissionContext = request
+        .getApplicationSubmissionContext();
     try {
-      applicationsManager.submitApplication(context);
+
+      ApplicationId applicationId = submissionContext.getApplicationId();
+      String clientTokenStr = null;
+      String user = UserGroupInformation.getCurrentUser().getShortUserName();
+      if (UserGroupInformation.isSecurityEnabled()) {
+        Token<ApplicationTokenIdentifier> clientToken = new Token<ApplicationTokenIdentifier>(
+            new ApplicationTokenIdentifier(applicationId),
+            this.clientToAMSecretManager);
+        clientTokenStr = clientToken.encodeToUrlString();
+        LOG.debug("Sending client token as " + clientTokenStr);
+      }
+
+      submissionContext.setQueue(submissionContext.getQueue() == null
+          ? "default" : submissionContext.getQueue());
+      submissionContext.setApplicationName(submissionContext
+          .getApplicationName() == null ? "N/A" : submissionContext
+          .getApplicationName());
+
+      ApplicationStore appStore = rmContext.getApplicationsStore()
+          .createApplicationStore(submissionContext.getApplicationId(),
+              submissionContext);
+      Application application = new ApplicationImpl(rmContext, getConfig(),
+          user, submissionContext, clientTokenStr, appStore,
+          this.amLivelinessMonitor);
+      if (rmContext.getApplications().putIfAbsent(
+          application.getApplicationID(), application) != null) {
+        throw new IOException("Application with id "
+            + application.getApplicationID()
+            + " is already present! Cannot add a duplicate!");
+      }
+
+      /**
+       * this can throw so we need to call it synchronously to let the client
+       * know as soon as it submits. For backwards compatibility we cannot make
+       * it asynchronous
+       */
+      try {
+        scheduler.addApplication(applicationId, application.getMaster(),
+            user, application.getQueue(), submissionContext.getPriority(),
+            application.getStore());
+      } catch (IOException io) {
+        LOG.info("Failed to submit application " + applicationId, io);
+        rmContext.getDispatcher().getSyncHandler().handle(
+            new ApplicationEvent(ApplicationEventType.FAILED, applicationId));
+        throw io;
+      }
+
+      rmContext.getDispatcher().getSyncHandler().handle(
+          new ApplicationEvent(ApplicationEventType.ALLOCATE, applicationId));
+
+      // TODO this should happen via dispatcher. should move it out to scheudler
+      // negotiator.
+      LOG.info("Application with id " + applicationId.getId()
+          + " submitted by user " + user + " with " + submissionContext);
     } catch (IOException ie) {
       LOG.info("Exception in submitting application", ie);
       throw RPCUtil.getRemoteException(ie);
     }
-    SubmitApplicationResponse response = recordFactory.newRecordInstance(SubmitApplicationResponse.class);
+
+    SubmitApplicationResponse response = recordFactory
+        .newRecordInstance(SubmitApplicationResponse.class);
     return response;
   }
 
   @Override
-  public FinishApplicationResponse finishApplication(FinishApplicationRequest request) throws YarnRemoteException {
+  public FinishApplicationResponse finishApplication(
+      FinishApplicationRequest request) throws YarnRemoteException {
+
     ApplicationId applicationId = request.getApplicationId();
+
+    UserGroupInformation callerUGI;
     try {
-      UserGroupInformation callerUGI = UserGroupInformation.getCurrentUser();
-      applicationsManager.finishApplication(applicationId, callerUGI);
-    } catch(IOException ie) {
-      LOG.info("Error finishing application ", ie);
+      callerUGI = UserGroupInformation.getCurrentUser();
+    } catch (IOException ie) {
+      LOG.info("Error getting UGI ", ie);
+      throw RPCUtil.getRemoteException(ie);
+    }
+
+    Application application = rmContext.getApplications().get(applicationId);
+    // TODO: What if null
+    if (!checkAccess(callerUGI, application.getUser(),
+        ApplicationACL.MODIFY_APP)) {
+      throw RPCUtil.getRemoteException(new AccessControlException("User "
+          + callerUGI.getShortUserName() + " cannot perform operation "
+          + ApplicationACL.MODIFY_APP.name() + " on " + applicationId));
     }
-    FinishApplicationResponse response = recordFactory.newRecordInstance(FinishApplicationResponse.class);
+
+    rmContext.getDispatcher().getEventHandler().handle(
+        new ApplicationEvent(ApplicationEventType.KILL, applicationId));
+
+    FinishApplicationResponse response = recordFactory
+        .newRecordInstance(FinishApplicationResponse.class);
     return response;
   }
 
@@ -171,9 +335,17 @@ public class ClientRMService extends AbstractService implements ClientRMProtocol
   @Override
   public GetAllApplicationsResponse getAllApplications(
       GetAllApplicationsRequest request) throws YarnRemoteException {
+
+    List<ApplicationReport> reports = new ArrayList<ApplicationReport>();
+    for (Application application : rmContext.getApplications().values()) {
+      reports.add(createApplicationReport(application, application.getUser(),
+          application.getQueue(), application.getName(), application
+              .getMasterContainer()));
+    }
+
     GetAllApplicationsResponse response = 
       recordFactory.newRecordInstance(GetAllApplicationsResponse.class);
-    response.setApplicationList(applicationsManager.getApplications());
+    response.setApplicationList(reports);
     return response;
   }
 

+ 61 - 14
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java

@@ -20,6 +20,8 @@ package org.apache.hadoop.yarn.server.resourcemanager;
 
 
 import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.avro.AvroRuntimeException;
@@ -30,12 +32,16 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.security.SecurityUtil;
 import org.apache.hadoop.util.ReflectionUtils;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationsManager;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationImpl;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationsManagerImpl;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.
-  ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.NodeStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Recoverable;
@@ -61,7 +67,7 @@ public class ResourceManager extends CompositeService implements Recoverable {
   public static final long clusterTimeStamp = System.currentTimeMillis();
   private YarnConfiguration conf;
   
-  private ApplicationsManagerImpl applicationsManager;
+  private ApplicationsManager applicationsManager;
   
   private ContainerTokenSecretManager containerTokenSecretManager =
       new ContainerTokenSecretManager();
@@ -69,7 +75,6 @@ public class ResourceManager extends CompositeService implements Recoverable {
   private ApplicationTokenSecretManager appTokenSecretManager =
       new ApplicationTokenSecretManager();
 
-  
   private ResourceScheduler scheduler;
   private ResourceTrackerService resourceTracker;
   private ClientRMService clientRM;
@@ -93,12 +98,15 @@ public class ResourceManager extends CompositeService implements Recoverable {
     public RMDispatcherImpl getDispatcher();
     public NodeStore getNodeStore();
     public ApplicationsStore getApplicationsStore();
+    public ConcurrentMap<ApplicationId, Application> getApplications();
   }
   
   public static class RMContextImpl implements RMContext {
     private final RMDispatcherImpl asmEventDispatcher;
     private final Store store;
-    
+    private final ConcurrentMap<ApplicationId, Application> applications = 
+      new ConcurrentHashMap<ApplicationId, Application>();
+
     public RMContextImpl(Store store) {
       this.asmEventDispatcher = new RMDispatcherImpl();
       this.store = store;
@@ -118,6 +126,11 @@ public class ResourceManager extends CompositeService implements Recoverable {
     public ApplicationsStore getApplicationsStore() {
       return store;
     }
+
+    @Override
+    public ConcurrentMap<ApplicationId, Application> getApplications() {
+      return this.applications;
+    }
   }
   
   
@@ -134,13 +147,17 @@ public class ResourceManager extends CompositeService implements Recoverable {
           conf.getClass(RMConfig.RESOURCE_SCHEDULER, 
               FifoScheduler.class, ResourceScheduler.class), 
           this.conf);
-  
+
+    // Register event handler for ApplicationEvents.
+    this.rmContext.getDispatcher().register(ApplicationEventType.class,
+        new ApplicationEventDispatcher(this.rmContext));
+
     this.rmContext.getDispatcher().register(ApplicationTrackerEventType.class, scheduler);
     //TODO change this to be random
     this.appTokenSecretManager.setMasterKey(ApplicationTokenSecretManager
         .createSecretKey("Dummy".getBytes()));
 
-    applicationsManager = createApplicationsManagerImpl();
+    applicationsManager = createApplicationsManager();
     addService(applicationsManager);
     
     resourceTracker = createResourceTrackerService();
@@ -166,7 +183,30 @@ public class ResourceManager extends CompositeService implements Recoverable {
 
     super.init(conf);
   }
-  
+
+  public static final class ApplicationEventDispatcher implements
+      EventHandler<ApplicationEvent> {
+
+    private final RMContext rmContext;
+
+    public ApplicationEventDispatcher(RMContext rmContext) {
+      this.rmContext = rmContext;
+    }
+
+    @Override
+    public void handle(ApplicationEvent event) {
+      ApplicationId appID = event.getApplicationId();
+      ApplicationImpl application = (ApplicationImpl) this.rmContext
+          .getApplications().get(appID);
+      try {
+        application.handle(event);
+      } catch (Throwable t) {
+        LOG.error("Error in handling event type " + event.getType()
+            + " for application " + event.getApplicationId(), t);
+      }
+    }
+  }
+
   @Override
   public void start() {
     try {
@@ -222,19 +262,21 @@ public class ResourceManager extends CompositeService implements Recoverable {
             this.rmContext));
   }
   
-  protected ApplicationsManagerImpl createApplicationsManagerImpl() {
+  protected ApplicationsManager createApplicationsManager() {
     return new ApplicationsManagerImpl(
         this.appTokenSecretManager, this.scheduler, this.rmContext);
   }
 
   protected ClientRMService createClientRMService() {
-    return new ClientRMService(applicationsManager, 
-        resourceTracker.getResourceTracker(), scheduler);
+    return new ClientRMService(this.rmContext, this.applicationsManager
+        .getAmLivelinessMonitor(), this.applicationsManager
+        .getClientToAMSecretManager(), resourceTracker.getResourceTracker(),
+        scheduler);
   }
 
   protected ApplicationMasterService createApplicationMasterService() {
-    return new ApplicationMasterService(
-      this.appTokenSecretManager, applicationsManager, scheduler, this.rmContext);
+    return new ApplicationMasterService(this.appTokenSecretManager,
+        scheduler, this.rmContext);
   }
   
 
@@ -243,6 +285,11 @@ public class ResourceManager extends CompositeService implements Recoverable {
     return new AdminService(conf, scheduler, nodesTracker);
   }
 
+  @Private
+  public ClientRMService getClientRMService() {
+    return this.clientRM;
+  }
+
   /**
    * return applications manager.
    * @return

+ 38 - 39
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLauncher.java

@@ -64,43 +64,47 @@ import org.apache.hadoop.yarn.security.ContainerManagerSecurityInfo;
 import org.apache.hadoop.yarn.security.ContainerTokenIdentifier;
 import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMFinishEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
 
+/**
+ * The launch of the AM itself.
+ */
 public class AMLauncher implements Runnable {
 
   private static final Log LOG = LogFactory.getLog(AMLauncher.class);
 
   private ContainerManager containerMgrProxy;
 
-  private final AppContext master;
+  private final Application application;
   private final Configuration conf;
   private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
-  private ApplicationTokenSecretManager applicationTokenSecretManager;
-  private ClientToAMSecretManager clientToAMSecretManager;
-  private AMLauncherEventType event;
+  private final ApplicationTokenSecretManager applicationTokenSecretManager;
+  private final ClientToAMSecretManager clientToAMSecretManager;
+  private final AMLauncherEventType eventType;
   
   @SuppressWarnings("rawtypes")
-  private EventHandler handler;
+  private final EventHandler handler;
   
   @SuppressWarnings("unchecked")
-  public AMLauncher(RMContext asmContext, AppContext master,
-      AMLauncherEventType event,ApplicationTokenSecretManager applicationTokenSecretManager,
+  public AMLauncher(RMContext asmContext, Application application,
+      AMLauncherEventType eventType,ApplicationTokenSecretManager applicationTokenSecretManager,
       ClientToAMSecretManager clientToAMSecretManager, Configuration conf) {
-    this.master = master;
+    this.application = application;
     this.conf = new Configuration(conf); // Just not to touch the sec-info class
     this.applicationTokenSecretManager = applicationTokenSecretManager;
     this.clientToAMSecretManager = clientToAMSecretManager;
     this.conf.setClass(
         CommonConfigurationKeysPublic.HADOOP_SECURITY_INFO_CLASS_NAME,
         ContainerManagerSecurityInfo.class, SecurityInfo.class);
-    this.event = event;
+    this.eventType = eventType;
     this.handler = asmContext.getDispatcher().getEventHandler();
   }
   
   private void connect() throws IOException {
-    ContainerId masterContainerID = master.getMasterContainer().getId();
+    ContainerId masterContainerID = application.getMasterContainer().getId();
     
     containerMgrProxy =
         getContainerMgrProxy(masterContainerID.getAppId());
@@ -108,23 +112,23 @@ public class AMLauncher implements Runnable {
   
   private void launch() throws IOException {
     connect();
-    ContainerId masterContainerID = master.getMasterContainer().getId();
+    ContainerId masterContainerID = application.getMasterContainer().getId();
     ApplicationSubmissionContext applicationContext =
-      master.getSubmissionContext();
-    LOG.info("Setting up container " + master.getMasterContainer() 
-        + " for AM " + master.getMaster());  
+      application.getSubmissionContext();
+    LOG.info("Setting up container " + application.getMasterContainer() 
+        + " for AM " + application.getMaster());  
     ContainerLaunchContext launchContext =
         createAMContainerLaunchContext(applicationContext, masterContainerID);
     StartContainerRequest request = recordFactory.newRecordInstance(StartContainerRequest.class);
     request.setContainerLaunchContext(launchContext);
     containerMgrProxy.startContainer(request);
-    LOG.info("Done launching container " + master.getMasterContainer() 
-        + " for AM " + master.getMaster());
+    LOG.info("Done launching container " + application.getMasterContainer() 
+        + " for AM " + application.getMaster());
   }
   
   private void cleanup() throws IOException {
     connect();
-    ContainerId containerId = master.getMasterContainer().getId();
+    ContainerId containerId = application.getMasterContainer().getId();
     StopContainerRequest stopRequest = recordFactory.newRecordInstance(StopContainerRequest.class);
     stopRequest.setContainerId(containerId);
     containerMgrProxy.stopContainer(stopRequest);
@@ -133,7 +137,7 @@ public class AMLauncher implements Runnable {
   private ContainerManager getContainerMgrProxy(
       final ApplicationId applicationID) throws IOException {
 
-    Container container = master.getMasterContainer();
+    Container container = application.getMasterContainer();
 
     final String containerManagerBindAddress = container.getContainerManagerAddress();
 
@@ -168,9 +172,10 @@ public class AMLauncher implements Runnable {
     ContainerLaunchContext container = recordFactory.newRecordInstance(ContainerLaunchContext.class);
     container.addAllCommands(applicationMasterContext.getCommandList());
     StringBuilder mergedCommand = new StringBuilder();
-    String failCount = Integer.toString(master.getFailedCount());
+    String failCount = Integer.toString(application.getFailedCount());
     List<String> commandList = new ArrayList<String>();
     for (String str : container.getCommandList()) {
+      // This is out-right wrong. AM FAIL count should be passed via env.
       String result =
           str.replaceFirst(ApplicationConstants.AM_FAIL_COUNT_STRING,
               failCount);
@@ -213,8 +218,8 @@ public class AMLauncher implements Runnable {
         credentials.readTokenStorageStream(dibb);
       }
 
-      ApplicationTokenIdentifier id =
-          new ApplicationTokenIdentifier(master.getMasterContainer().getId().getAppId());
+      ApplicationTokenIdentifier id = new ApplicationTokenIdentifier(
+          application.getApplicationID());
       Token<ApplicationTokenIdentifier> token =
           new Token<ApplicationTokenIdentifier>(id,
               this.applicationTokenSecretManager);
@@ -238,9 +243,8 @@ public class AMLauncher implements Runnable {
       credentials.writeTokenStorageToStream(dob);
       asc.setFsTokensTodo(ByteBuffer.wrap(dob.getData(), 0, dob.getLength()));
 
-      ApplicationTokenIdentifier identifier =
-          new ApplicationTokenIdentifier(
-              this.master.getMaster().getApplicationId());
+      ApplicationTokenIdentifier identifier = new ApplicationTokenIdentifier(
+          this.application.getApplicationID());
       SecretKey clientSecretKey =
           this.clientToAMSecretManager.getMasterKey(identifier);
       String encoded =
@@ -253,35 +257,30 @@ public class AMLauncher implements Runnable {
   
   @SuppressWarnings("unchecked")
   public void run() {
-    switch (event) {
+    switch (eventType) {
     case LAUNCH:
-      ApplicationEventType eventType = ApplicationEventType.LAUNCHED;
+      ApplicationEventType targetEventType = ApplicationEventType.LAUNCHED;
       try {
-        LOG.info("Launching master" + master.getMaster());
+        LOG.info("Launching master" + application.getMaster());
         launch();
       } catch(Exception ie) {
         LOG.info("Error launching ", ie);
-        eventType = ApplicationEventType.LAUNCH_FAILED;
+        targetEventType = ApplicationEventType.LAUNCH_FAILED;
       }
-      handler.handle(new ApplicationMasterInfoEvent(eventType, master
+      handler.handle(new ApplicationEvent(targetEventType, application
           .getApplicationID()));
       break;
     case CLEANUP:
       try {
-        LOG.info("Cleaning master " + master.getMaster());
+        LOG.info("Cleaning master " + application.getMaster());
         cleanup();
       } catch(IOException ie) {
         LOG.info("Error cleaning master ", ie);
       }
-      handler.handle(new ApplicationFinishEvent(master.getApplicationID(),
-          ApplicationState.COMPLETED)); // Doesn't matter what state you send :) :(
       break;
     default:
+      LOG.warn("Received unknown event-type " + eventType + ". Ignoring.");
       break;
     }
   }
-
-  public AppContext getApplicationContext() {
-   return master;
-  }
 }

+ 4 - 3
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLivelinessMonitor.java

@@ -34,14 +34,15 @@ import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.server.resourcemanager.RMConfig;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
 import org.apache.hadoop.yarn.service.AbstractService;
 
 /**
  * This class runs continuosly to track the application masters
  * that might be dead.
  */
-class AMLivelinessMonitor extends AbstractService {
+public class AMLivelinessMonitor extends AbstractService {
   private volatile boolean stop = false;
   long monitoringInterval =
       RMConfig.DEFAULT_AMLIVELINESS_MONITORING_INTERVAL;
@@ -156,7 +157,7 @@ class AMLivelinessMonitor extends AbstractService {
   private void expireAMs(List<ApplicationId> toExpire) {
     for (ApplicationId applicationId: toExpire) {
       LOG.info("Expiring the Application " + applicationId);
-      handler.handle(new ApplicationMasterInfoEvent(
+      handler.handle(new ApplicationEvent(
           ApplicationEventType.EXPIRE, applicationId));
     }
   }

+ 0 - 235
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMTracker.java

@@ -1,235 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.classification.InterfaceAudience.Private;
-import org.apache.hadoop.classification.InterfaceStability.Evolving;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-import org.apache.hadoop.yarn.api.records.ApplicationStatus;
-import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
-import org.apache.hadoop.yarn.event.EventHandler;
-import org.apache.hadoop.yarn.factories.RecordFactory;
-import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
-import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore;
-import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
-import org.apache.hadoop.yarn.server.resourcemanager.recovery.Recoverable;
-import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.ApplicationInfo;
-import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.RMState;
-import org.apache.hadoop.yarn.service.CompositeService;
-
-/**
- * This class tracks the application masters that are running. It tracks
- * heartbeats from application master to see if it needs to expire some application
- * master.
- */
-@Evolving
-@Private
-public class AMTracker extends CompositeService implements Recoverable {
-  private static final Log LOG = LogFactory.getLog(AMTracker.class);
-  private AMLivelinessMonitor amLivelinessMonitor;
-  @SuppressWarnings("rawtypes")
-  private EventHandler handler;
-  private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
-
-  private final RMContext rmContext;
-
-  private final Map<ApplicationId, ApplicationMasterInfo> applications = 
-    new ConcurrentHashMap<ApplicationId, ApplicationMasterInfo>();
-
-  private final ApplicationsStore appsStore;
-
-  public AMTracker(RMContext rmContext) {
-    super(AMTracker.class.getName());
-    this.rmContext = rmContext;
-    this.appsStore = rmContext.getApplicationsStore();
-    this.handler = rmContext.getDispatcher().getEventHandler();
-    this.amLivelinessMonitor = new AMLivelinessMonitor(this.handler);
-    addService(this.amLivelinessMonitor);
-  }
-
-  @Override
-  public void init(Configuration conf) {
-    this.rmContext.getDispatcher().register(ApplicationEventType.class,
-        new ApplicationEventDispatcher());
-    super.init(conf);
-  }
-
-  private final class ApplicationEventDispatcher implements
-      EventHandler<ApplicationMasterInfoEvent> {
-
-    public ApplicationEventDispatcher() {
-    }
-
-    @Override
-    public void handle(ApplicationMasterInfoEvent event) {
-      ApplicationId appID = event.getApplicationId();
-      ApplicationMasterInfo masterInfo = null;
-      synchronized (applications) {
-        masterInfo = applications.get(appID);
-      }
-      try {
-        masterInfo.handle(event);
-      } catch (Throwable t) {
-        LOG.error("Error in handling event type " + event.getType()
-            + " for application " + event.getApplicationId());
-      }
-    }
-  }
-
-  public void addMaster(String user,  ApplicationSubmissionContext 
-      submissionContext, String clientToken) throws IOException {
-    
-    ApplicationStore appStore = appsStore.createApplicationStore(submissionContext.getApplicationId(),
-        submissionContext);
-    ApplicationMasterInfo applicationMaster = new ApplicationMasterInfo(
-        rmContext, getConfig(), user, submissionContext, clientToken,
-        appStore, this.amLivelinessMonitor);
-    synchronized(applications) {
-      applications.put(applicationMaster.getApplicationID(), applicationMaster);
-    }
-    
-  }
-  
-  public void runApplication(ApplicationId applicationId) {
-    rmContext.getDispatcher().getSyncHandler().handle(
-        new ApplicationMasterInfoEvent(ApplicationEventType.ALLOCATE,
-            applicationId));
-  }
-  
-  public void finishNonRunnableApplication(ApplicationId applicationId) {
-    rmContext.getDispatcher().getSyncHandler().handle(
-        new ApplicationMasterInfoEvent(ApplicationEventType.FAILED,
-            applicationId));
-   }
-
-  public void finish(ApplicationMaster remoteApplicationMaster) {
-    ApplicationId applicationId = remoteApplicationMaster.getApplicationId() ;
-    ApplicationMasterInfo masterInfo = null;
-    synchronized(applications) {
-      masterInfo = applications.get(applicationId);
-    }
-    if (masterInfo == null) {
-      LOG.info("Cant find application to finish " + applicationId);
-      return;
-    }
-    masterInfo.getMaster().setTrackingUrl(
-        remoteApplicationMaster.getTrackingUrl());
-    masterInfo.getMaster().setDiagnostics(
-        remoteApplicationMaster.getDiagnostics());
-
-    rmContext.getDispatcher().getEventHandler().handle(
-        new ApplicationFinishEvent(applicationId, remoteApplicationMaster
-            .getState()));
-  }
-
-  public ApplicationMasterInfo get(ApplicationId applicationId) {
-    ApplicationMasterInfo masterInfo = null;
-    synchronized (applications) {
-      masterInfo = applications.get(applicationId);
-    }
-    return masterInfo;
-  }
-
-  /* As of now we dont remove applications from the RM */
-  /* TODO we need to decide on a strategy for expiring done applications */
-  public void remove(ApplicationId applicationId) {
-    synchronized (applications) {
-      //applications.remove(applicationId);
-      this.amLivelinessMonitor.unRegister(applicationId);
-    }
-  }
-
-  public synchronized List<AppContext> getAllApplications() {
-    List<AppContext> allAMs = new ArrayList<AppContext>();
-    synchronized (applications) {
-      for ( ApplicationMasterInfo val: applications.values()) {
-        allAMs.add(val);
-      }
-    }
-    return allAMs;
-  }
-
-  public void kill(ApplicationId applicationID) {
-    handler.handle(new ApplicationMasterInfoEvent(ApplicationEventType.KILL,
-        applicationID));
-  }
-
-  public void heartBeat(ApplicationStatus status) {
-    ApplicationMaster master = recordFactory.newRecordInstance(ApplicationMaster.class);
-    master.setStatus(status);
-    master.setApplicationId(status.getApplicationId());
-    handler.handle(new ApplicationMasterStatusUpdateEvent(status));
-  }
-
-  public void registerMaster(ApplicationMaster applicationMaster) {
-    ApplicationMasterInfo master = null;
-    synchronized(applications) {
-      master = applications.get(applicationMaster.getApplicationId());
-    }
-    LOG.info("AM registration " + master.getMaster());
-    handler.handle(new ApplicationMasterRegistrationEvent(applicationMaster));
-  }
-
-  @Override
-  public void recover(RMState state) {
-    for (Map.Entry<ApplicationId, ApplicationInfo> entry: state.getStoredApplications().entrySet()) {
-      ApplicationId appId = entry.getKey();
-      ApplicationInfo appInfo = entry.getValue();
-      ApplicationMasterInfo masterInfo = null;
-      try {
-        masterInfo = new ApplicationMasterInfo(this.rmContext, getConfig(),
-            appInfo.getApplicationSubmissionContext().getUser(), appInfo
-                .getApplicationSubmissionContext(), appInfo
-                .getApplicationMaster().getClientToken(), this.appsStore
-                .createApplicationStore(appId, appInfo
-                    .getApplicationSubmissionContext()),
-            this.amLivelinessMonitor);
-      } catch(IOException ie) {
-        //ignore
-      }
-      ApplicationMaster master = masterInfo.getMaster();
-      ApplicationMaster storedAppMaster = appInfo.getApplicationMaster();
-      master.setAMFailCount(storedAppMaster.getAMFailCount());
-      master.setApplicationId(storedAppMaster.getApplicationId());
-      master.setClientToken(storedAppMaster.getClientToken());
-      master.setContainerCount(storedAppMaster.getContainerCount());
-      master.setTrackingUrl(storedAppMaster.getTrackingUrl());
-      master.setDiagnostics(storedAppMaster.getDiagnostics());
-      master.setHost(storedAppMaster.getHost());
-      master.setRpcPort(storedAppMaster.getRpcPort());
-      master.setStatus(storedAppMaster.getStatus());
-      master.setState(storedAppMaster.getState());
-      applications.put(appId, masterInfo);
-      handler.handle(new ApplicationMasterInfoEvent(
-          ApplicationEventType.RECOVER, appId));
-    }
-  }
-}

+ 4 - 1
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AppContext.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/Application.java

@@ -20,6 +20,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
 
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
+import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationStatus;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.Container;
@@ -30,7 +31,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.
  * The context of an application. 
  *
  */
-public interface AppContext {
+public interface Application {
   
   /**
    * the application submission context for this application.
@@ -110,4 +111,6 @@ public interface AppContext {
    * @return the finish time of the application
    */
   public long getFinishTime();
+
+  ApplicationState getState();
 }

+ 144 - 140
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationImpl.java

@@ -43,11 +43,16 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.server.resourcemanager.RMConfig;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMFinishEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMAllocatedEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMRegistrationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMStatusUpdateEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.SNEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.state.InvalidStateTransitonException;
 import org.apache.hadoop.yarn.state.MultipleArcTransition;
@@ -63,9 +68,9 @@ import org.apache.hadoop.yarn.state.StateMachineFactory;
  */
 @Private
 @Unstable
-public class ApplicationMasterInfo implements AppContext,
-    EventHandler<ApplicationMasterInfoEvent> {
-  private static final Log LOG = LogFactory.getLog(ApplicationMasterInfo.class);
+public class ApplicationImpl implements Application,
+    EventHandler<ApplicationEvent> {
+  private static final Log LOG = LogFactory.getLog(ApplicationImpl.class);
   private final ApplicationSubmissionContext submissionContext;
   private ApplicationMaster master;
   private final EventHandler handler;
@@ -103,12 +108,12 @@ public class ApplicationMasterInfo implements AppContext,
   private final FailedLaunchTransition failedLaunchTransition = new FailedLaunchTransition();
   
   private final StateMachine<ApplicationState,
-                ApplicationEventType, ApplicationMasterInfoEvent> stateMachine;
+                ApplicationEventType, ApplicationEvent> stateMachine;
 
-  private final StateMachineFactory<ApplicationMasterInfo, ApplicationState,
-    ApplicationEventType, ApplicationMasterInfoEvent> stateMachineFactory
-          = new StateMachineFactory<ApplicationMasterInfo, ApplicationState,
-    ApplicationEventType, ApplicationMasterInfoEvent>(ApplicationState.PENDING)
+  private final StateMachineFactory<ApplicationImpl, ApplicationState,
+    ApplicationEventType, ApplicationEvent> stateMachineFactory
+          = new StateMachineFactory<ApplicationImpl, ApplicationState,
+    ApplicationEventType, ApplicationEvent>(ApplicationState.PENDING)
 
   // Transitions from PENDING State
   .addTransition(ApplicationState.PENDING, ApplicationState.ALLOCATING,
@@ -213,7 +218,7 @@ public class ApplicationMasterInfo implements AppContext,
 
 
 
-  public ApplicationMasterInfo(RMContext context, Configuration conf,
+  public ApplicationImpl(RMContext context, Configuration conf,
       String user, ApplicationSubmissionContext submissionContext,
       String clientToken, ApplicationStore appStore,
       AMLivelinessMonitor amLivelinessMonitor) {
@@ -264,15 +269,12 @@ public class ApplicationMasterInfo implements AppContext,
     return master.getStatus();
   }
 
-  public synchronized void updateStatus(ApplicationStatus status) {
-    this.master.setStatus(status);
-  }
-
   @Override
   public synchronized ApplicationMaster getMaster() {
     return master;
   }
 
+  @Override
   /* make sure the master state is in sync with statemachine state */
   public synchronized ApplicationState getState() {
     return master.getState();
@@ -323,141 +325,143 @@ public class ApplicationMasterInfo implements AppContext,
   /* the applicaiton master completed successfully */
   private static class DoneTransition
       implements
-      MultipleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent, ApplicationState> {
+      MultipleArcTransition<ApplicationImpl, ApplicationEvent, ApplicationState> {
 
     @Override
-    public ApplicationState transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.handler.handle(new ASMEvent<SNEventType>(
-        SNEventType.CLEANUP, masterInfo));
-      masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
-        AMLauncherEventType.CLEANUP, masterInfo));
-      masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
-      ApplicationTrackerEventType.REMOVE, masterInfo));
-      masterInfo.finishTime = System.currentTimeMillis();
-
-      masterInfo.amLivelinessMonitor.unRegister(event.getApplicationId());
-
-      ApplicationFinishEvent finishEvent = (ApplicationFinishEvent) event;
+    public ApplicationState transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.handler.handle(new ASMEvent<SNEventType>(
+        SNEventType.RELEASE, application));
+      application.handler.handle(new ASMEvent<AMLauncherEventType>(
+        AMLauncherEventType.CLEANUP, application));
+      application.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
+      ApplicationTrackerEventType.REMOVE, application));
+      application.finishTime = System.currentTimeMillis();
+
+      application.amLivelinessMonitor.unRegister(event.getApplicationId());
+
+      AMFinishEvent finishEvent = (AMFinishEvent) event;
+      application.master.setTrackingUrl(finishEvent.getTrackingUrl());
+      application.master.setDiagnostics(finishEvent.getDiagnostics());
       return finishEvent.getFinalApplicationState();
     }
   }
   
   private static class AllocatingKillTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(ApplicationTrackerEventType.REMOVE,
-          masterInfo));
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.handler.handle(new ASMEvent<ApplicationTrackerEventType>(ApplicationTrackerEventType.REMOVE,
+          application));
     }
   }
   
   private static class KillTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.finishTime = System.currentTimeMillis();
-      masterInfo.getMaster().setDiagnostics(DIAGNOSTIC_KILL_APPLICATION);
-      masterInfo.handler.handle(new ASMEvent<SNEventType>(SNEventType.CLEANUP, masterInfo));
-      masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(AMLauncherEventType.CLEANUP, masterInfo));
-      masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(ApplicationTrackerEventType.REMOVE,
-          masterInfo));
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.finishTime = System.currentTimeMillis();
+      application.getMaster().setDiagnostics(DIAGNOSTIC_KILL_APPLICATION);
+      application.handler.handle(new ASMEvent<SNEventType>(SNEventType.RELEASE, application));
+      application.handler.handle(new ASMEvent<AMLauncherEventType>(AMLauncherEventType.CLEANUP, application));
+      application.handler.handle(new ASMEvent<ApplicationTrackerEventType>(ApplicationTrackerEventType.REMOVE,
+          application));
     }
   }
 
   private static class RecoverLaunchTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
 
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
-          ApplicationTrackerEventType.ADD, masterInfo));
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
+          ApplicationTrackerEventType.ADD, application));
         
-      masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
-          AMLauncherEventType.LAUNCH, masterInfo));
+      application.handler.handle(new ASMEvent<AMLauncherEventType>(
+          AMLauncherEventType.LAUNCH, application));
     }
   }
   
   private static class FailedLaunchTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.finishTime = System.currentTimeMillis();
-      masterInfo.getMaster().setDiagnostics(DIAGNOSTIC_AM_LAUNCH_FAILED);
-      masterInfo.handler.handle(new ASMEvent<SNEventType>(
-      SNEventType.RELEASE, masterInfo));
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.finishTime = System.currentTimeMillis();
+      application.getMaster().setDiagnostics(DIAGNOSTIC_AM_LAUNCH_FAILED);
+      application.handler.handle(new ASMEvent<SNEventType>(
+      SNEventType.RELEASE, application));
     }
   }
   
   private static class LaunchTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
-      AMLauncherEventType.LAUNCH, masterInfo));
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.handler.handle(new ASMEvent<AMLauncherEventType>(
+      AMLauncherEventType.LAUNCH, application));
     }
   }
   
   private static class RecoverRunningTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
-          ApplicationTrackerEventType.ADD, masterInfo));
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
+          ApplicationTrackerEventType.ADD, application));
       /* make sure the time stamp is update else expiry thread will expire this */
-      masterInfo.amLivelinessMonitor.receivedPing(event.getApplicationId());
+      application.amLivelinessMonitor.receivedPing(event.getApplicationId());
     }
   }
   
   private static class RecoverLaunchedTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
-          ApplicationTrackerEventType.ADD, masterInfo));
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
+          ApplicationTrackerEventType.ADD, application));
         
-      masterInfo.amLivelinessMonitor.register(event.getApplicationId());
+      application.amLivelinessMonitor.register(event.getApplicationId());
     }
   }
 
 
   private static class LaunchedTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.amLivelinessMonitor.register(event.getApplicationId());
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.amLivelinessMonitor.register(event.getApplicationId());
     }
   }
 
   private static class ExpireTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
       /* for now this is the same as killed transition but will change later */
-      masterInfo.handler.handle(new ASMEvent<SNEventType>(SNEventType.CLEANUP,
-        masterInfo));
-      masterInfo.handler.handle(new ASMEvent<AMLauncherEventType>(
-        AMLauncherEventType.CLEANUP, masterInfo));
-      masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
-          ApplicationTrackerEventType.EXPIRE, masterInfo));
-      masterInfo.numFailed++;
+      application.handler.handle(new ASMEvent<SNEventType>(SNEventType.RELEASE,
+        application));
+      application.handler.handle(new ASMEvent<AMLauncherEventType>(
+        AMLauncherEventType.CLEANUP, application));
+      application.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
+          ApplicationTrackerEventType.EXPIRE, application));
+      application.numFailed++;
 
       /* check to see if the number of retries are reached or not */
-      if (masterInfo.getFailedCount() < masterInfo.amMaxRetries) {
-        masterInfo.handler.handle(new ApplicationMasterInfoEvent(
+      if (application.getFailedCount() < application.amMaxRetries) {
+        application.handler.handle(new ApplicationEvent(
             ApplicationEventType.ALLOCATE, event.getApplicationId()));
       } else {
-        masterInfo.handler.handle(new ApplicationMasterInfoEvent(
-            ApplicationEventType.FAILED_MAX_RETRIES, masterInfo
+        application.handler.handle(new ApplicationEvent(
+            ApplicationEventType.FAILED_MAX_RETRIES, application
                 .getApplicationID()));
       }
     }
@@ -466,75 +470,75 @@ public class ApplicationMasterInfo implements AppContext,
 
   /* Transition to schedule again on a container launch failure for AM */
   private static class ScheduleTransition implements 
-  SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+  SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      masterInfo.masterContainer = null;
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      application.masterContainer = null;
       /* schedule for a slot */
-      masterInfo.handler.handle(new ASMEvent<SNEventType>(SNEventType.SCHEDULE,
-      masterInfo));
+      application.handler.handle(new ASMEvent<SNEventType>(SNEventType.SCHEDULE,
+      application));
     }
   }
   
   /* Transition to start the process of allocating for the AM container */
   private static class AllocateTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
       /* notify tracking applications that an applicaiton has been added */
       // TODO: For now, changing to synchHandler. Instead we should use register/deregister.
-      masterInfo.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
-        ApplicationTrackerEventType.ADD, masterInfo));
+      application.syncHandler.handle(new ASMEvent<ApplicationTrackerEventType>(
+        ApplicationTrackerEventType.ADD, application));
       
       /* schedule for a slot */
-      masterInfo.handler.handle(new ASMEvent<SNEventType>(
-          SNEventType.SCHEDULE, masterInfo));
+      application.handler.handle(new ASMEvent<SNEventType>(
+          SNEventType.SCHEDULE, application));
     }
   }
   
   /* Transition on a container allocated for a container */
   private static class AllocatedTransition
       implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
 
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
       /* set the container that was generated by the scheduler negotiator */
-      ApplicationMasterAllocatedEvent allocatedEvent = 
-         (ApplicationMasterAllocatedEvent) event;
-      masterInfo.masterContainer = allocatedEvent.getMasterContainer();
+      AMAllocatedEvent allocatedEvent = 
+         (AMAllocatedEvent) event;
+      application.masterContainer = allocatedEvent.getMasterContainer();
       try {
-        masterInfo.appStore.storeMasterContainer(masterInfo.masterContainer);
+        application.appStore.storeMasterContainer(application.masterContainer);
       } catch(IOException ie) {
         //TODO ignore for now fix later.
       }
 
       /* we need to launch the applicaiton master on allocated transition */
-      masterInfo.handler.handle(new ApplicationMasterInfoEvent(
-          ApplicationEventType.LAUNCH, masterInfo.getApplicationID()));
+      application.handler.handle(new ApplicationEvent(
+          ApplicationEventType.LAUNCH, application.getApplicationID()));
     }    
   }
 
   private static class RegisterTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      ApplicationMasterRegistrationEvent registrationEvent =
-        (ApplicationMasterRegistrationEvent) event;
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      AMRegistrationEvent registrationEvent =
+        (AMRegistrationEvent) event;
       ApplicationMaster registeredMaster = registrationEvent
           .getApplicationMaster();
-      masterInfo.master.setHost(registeredMaster.getHost());
-      masterInfo.master.setTrackingUrl(registeredMaster.getTrackingUrl());
-      masterInfo.master.setRpcPort(registeredMaster.getRpcPort());
-      masterInfo.master.setStatus(registeredMaster.getStatus());
-      masterInfo.master.getStatus().setProgress(0.0f);
-      masterInfo.amLivelinessMonitor.receivedPing(event.getApplicationId());
+      application.master.setHost(registeredMaster.getHost());
+      application.master.setTrackingUrl(registeredMaster.getTrackingUrl());
+      application.master.setRpcPort(registeredMaster.getRpcPort());
+      application.master.setStatus(registeredMaster.getStatus());
+      application.master.getStatus().setProgress(0.0f);
+      application.amLivelinessMonitor.receivedPing(event.getApplicationId());
       try {
-        masterInfo.appStore.updateApplicationState(masterInfo.master);
+        application.appStore.updateApplicationState(application.master);
       } catch(IOException ie) {
         //TODO fix this later. on error we should exit
       }
@@ -544,32 +548,32 @@ public class ApplicationMasterInfo implements AppContext,
   /* transition to finishing state on a cleanup, for now its not used, but will need it 
    * later */
   private static class FailedTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
 
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      LOG.info("Failed application: " + masterInfo.getApplicationID());
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      LOG.info("Failed application: " + application.getApplicationID());
     } 
   }
 
 
   /* Just a status update transition */
   private static class StatusUpdateTransition implements
-      SingleArcTransition<ApplicationMasterInfo, ApplicationMasterInfoEvent> {
+      SingleArcTransition<ApplicationImpl, ApplicationEvent> {
 
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
-        ApplicationMasterInfoEvent event) {
-      ApplicationMasterStatusUpdateEvent statusUpdateEvent = 
-        (ApplicationMasterStatusUpdateEvent) event;
-      masterInfo.master.setStatus(statusUpdateEvent.getApplicationStatus());
-      masterInfo.amLivelinessMonitor.receivedPing(event.getApplicationId());
+    public void transition(ApplicationImpl application,
+        ApplicationEvent event) {
+      AMStatusUpdateEvent statusUpdateEvent = 
+        (AMStatusUpdateEvent) event;
+      application.master.setStatus(statusUpdateEvent.getApplicationStatus());
+      application.amLivelinessMonitor.receivedPing(event.getApplicationId());
     }
   }
 
   @Override
-  public synchronized void handle(ApplicationMasterInfoEvent event) {
+  public synchronized void handle(ApplicationEvent event) {
 
     this.writeLock.lock();
 

+ 11 - 11
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterLauncher.java

@@ -28,12 +28,12 @@ import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
 import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
 import org.apache.hadoop.yarn.service.AbstractService;
 
 
-class ApplicationMasterLauncher extends AbstractService implements EventHandler<ASMEvent<AMLauncherEventType>> {
+public class ApplicationMasterLauncher extends AbstractService implements EventHandler<ASMEvent<AMLauncherEventType>> {
   private static final Log LOG = LogFactory.getLog(
       ApplicationMasterLauncher.class);
   private final ThreadPoolExecutor launcherPool;
@@ -67,14 +67,14 @@ class ApplicationMasterLauncher extends AbstractService implements EventHandler<
     super.start();
   }
   
-  protected Runnable createRunnableLauncher(AppContext masterInfo, AMLauncherEventType event) {
-    Runnable launcher = new AMLauncher(context, masterInfo, event,
+  protected Runnable createRunnableLauncher(Application application, AMLauncherEventType event) {
+    Runnable launcher = new AMLauncher(context, application, event,
         applicationTokenSecretManager, clientToAMSecretManager, getConfig());
     return launcher;
   }
   
-  private void launch(AppContext appContext) {
-    Runnable launcher = createRunnableLauncher(appContext, AMLauncherEventType.LAUNCH);
+  private void launch(Application application) {
+    Runnable launcher = createRunnableLauncher(application, AMLauncherEventType.LAUNCH);
     masterEvents.add(launcher);
   }
   
@@ -106,21 +106,21 @@ class ApplicationMasterLauncher extends AbstractService implements EventHandler<
     }
   }    
 
-  private void cleanup(AppContext appContext) {
-    Runnable launcher = createRunnableLauncher(appContext, AMLauncherEventType.CLEANUP);
+  private void cleanup(Application application) {
+    Runnable launcher = createRunnableLauncher(application, AMLauncherEventType.CLEANUP);
     masterEvents.add(launcher);
   } 
   
   @Override
   public synchronized void  handle(ASMEvent<AMLauncherEventType> appEvent) {
     AMLauncherEventType event = appEvent.getType();
-    AppContext appContext = appEvent.getAppContext();
+    Application application = appEvent.getApplication();
     switch (event) {
     case LAUNCH:
-      launch(appContext);
+      launch(application);
       break;
     case CLEANUP:
-      cleanup(appContext);
+      cleanup(application);
     default:
       break;
     }

+ 0 - 95
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManager.java

@@ -1,95 +0,0 @@
-/**
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.hadoop.classification.InterfaceAudience.Private;
-import org.apache.hadoop.classification.InterfaceStability.Evolving;
-import org.apache.hadoop.security.UserGroupInformation;
-import org.apache.hadoop.yarn.api.records.Application;
-import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
-import org.apache.hadoop.yarn.server.resourcemanager.recovery.Recoverable;
-
-/**
- * This interface defines the interface for ApplicationsManager. This interface
- * is used by the application submission clients to call into the applications manager.
- */
-@Private
-@Evolving
-public interface ApplicationsManager extends Recoverable {
-  /**
-   * Create and return a new application Id.
-   * @return a new application id
-   */
-   ApplicationId getNewApplicationID();
-   
-   /**
-    * Return the {@link ApplicationMaster} information for this application.
-    * @param applicationId the application id of the application
-    * @return the {@link ApplicationMaster} for this application
-    */
-   ApplicationMaster getApplicationMaster(ApplicationId applicationId);
-   
-   /**
-    * Get the information for this application.
-    * @param applicationID the applicaiton id for the application
-    * @return {@link Application} information about the application.
-    */
-   Application getApplication(ApplicationId applicationID);
-
-   /**
-    * Lookup AppContext by application id.
-    * @param appId the application id to lookup
-    * @return the {@link AppContext} of the application
-    */
-   AppContext getAppContext(ApplicationId appId);
-   
-   /**
-    * Submit the application to run on the cluster.
-    * @param context the {@link ApplicationSubmissionContext} for this application.
-    * @throws IOException
-    */
-   void submitApplication(ApplicationSubmissionContext context) throws IOException;
-   
-   /**
-    * Api to kill the application. 
-    * @param applicationId the {@link ApplicationId} to be killed.
-    * @param callerUGI the {@link UserGroupInformation} of the user calling it.
-    * @throws IOException
-    */
-   void finishApplication(ApplicationId applicationId, 
-       UserGroupInformation callerUGI) throws IOException;
-   
-   /**
-    * Get all the applications in the cluster.
-    * This is used by the webUI.
-    * @return the applications in the cluster.
-    */
-   List<AppContext> getAllAppContexts();
-   
-   /**
-    * Get all the applications in the cluster. 
-    * @return the list of applications in the cluster.
-    */
-   List<Application> getApplications();
-}

+ 56 - 188
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationsManagerImpl.java

@@ -19,38 +19,26 @@
 package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
 
 import java.io.IOException;
-import java.security.AccessControlException;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.security.UserGroupInformation;
-import org.apache.hadoop.security.authorize.AccessControlList;
-import org.apache.hadoop.security.token.Token;
-import org.apache.hadoop.yarn.api.records.Application;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-import org.apache.hadoop.yarn.api.records.ApplicationStatus;
-import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
-import org.apache.hadoop.yarn.api.records.Container;
 import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
-import org.apache.hadoop.yarn.ipc.RPCUtil;
-import org.apache.hadoop.yarn.security.ApplicationTokenIdentifier;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
 import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
-import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ApplicationsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.application.ApplicationACL;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.application.ApplicationACLsManager;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.ApplicationInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.RMState;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
 import org.apache.hadoop.yarn.service.CompositeService;
@@ -66,19 +54,16 @@ import org.apache.hadoop.yarn.service.Service;
  * AM's use to talk to the ASM via the RPC.
  */
 public class ApplicationsManagerImpl extends CompositeService
-  implements ApplicationsManager, ApplicationMasterHandler  {
+  implements ApplicationsManager  {
   private static final Log LOG = LogFactory.getLog(ApplicationsManagerImpl.class);
 
-  final private AtomicInteger applicationCounter = new AtomicInteger(0);
   final private YarnScheduler scheduler;
-  private AMTracker amTracker;
   private ClientToAMSecretManager clientToAMSecretManager =
     new ClientToAMSecretManager();
   private final EventHandler eventHandler;
   private final ApplicationTokenSecretManager applicationTokenSecretManager;
+  private AMLivelinessMonitor amLivelinessMonitor;
   private final RMContext rmContext; 
-  private  ApplicationACLsManager aclsManager;
-  private Map<ApplicationACL, AccessControlList> applicationACLs;
   private final RecordFactory recordFactory = 
     RecordFactoryProvider.getRecordFactory(null);
   
@@ -89,15 +74,17 @@ public class ApplicationsManagerImpl extends CompositeService
     this.rmContext = rmContext;
     this.eventHandler = this.rmContext.getDispatcher().getEventHandler();
     this.applicationTokenSecretManager = applicationTokenSecretManager;
+    this.amLivelinessMonitor = new AMLivelinessMonitor(this.eventHandler);
    }
-  
 
-  /**
-   * create a new am heart beat handler.
-   * @return create a new am heart beat handler.
-   */
-  protected AMTracker createNewAMTracker() {
-    return new AMTracker(this.rmContext);
+  @Override
+  public AMLivelinessMonitor getAmLivelinessMonitor() {
+    return this.amLivelinessMonitor;
+  }
+
+  @Override
+  public ClientToAMSecretManager getClientToAMSecretManager() {
+    return this.clientToAMSecretManager;
   }
 
   /**
@@ -135,10 +122,7 @@ public class ApplicationsManagerImpl extends CompositeService
   public  void init(Configuration conf) {
     addIfService(createNewApplicationMasterLauncher(applicationTokenSecretManager));
     addIfService(createNewSchedulerNegotiator(scheduler));
-    this.amTracker = createNewAMTracker();
-    addIfService(amTracker);
-    this.aclsManager = new ApplicationACLsManager(conf);
-    this.applicationACLs = aclsManager.constructApplicationACLs(conf);
+    addService(this.amLivelinessMonitor);
     super.init(conf);
   }
 
@@ -147,167 +131,51 @@ public class ApplicationsManagerImpl extends CompositeService
     super.start();
   }
 
-  @Override
-  public ApplicationMaster getApplicationMaster(ApplicationId applicationId) {
-    ApplicationMaster appMaster =
-      amTracker.get(applicationId).getMaster();
-    //TODO NPE (When the RM is restarted - it doesn't know about previous AMs)
-    return appMaster;
-  }
-  
-  @Override
-  public ApplicationId getNewApplicationID() {
-    ApplicationId applicationId =
-      org.apache.hadoop.yarn.util.BuilderUtils.newApplicationId(recordFactory,
-          ResourceManager.clusterTimeStamp, applicationCounter.incrementAndGet());
-    LOG.info("Allocated new applicationId: " + applicationId.getId());
-    return applicationId;
-  }
-
-  @Override
-  public  void submitApplication(ApplicationSubmissionContext context)
-  throws IOException {
-    String user;
-    ApplicationId applicationId = context.getApplicationId();
-    String clientTokenStr = null;
-    try {
-      user = UserGroupInformation.getCurrentUser().getShortUserName();
-      if (UserGroupInformation.isSecurityEnabled()) {
-        Token<ApplicationTokenIdentifier> clientToken =
-          new Token<ApplicationTokenIdentifier>(
-              new ApplicationTokenIdentifier(applicationId),
-              this.clientToAMSecretManager);
-        clientTokenStr = clientToken.encodeToUrlString();
-        LOG.debug("Sending client token as " + clientTokenStr);
-      }
-    } catch (IOException e) {
-      LOG.info("Error in submitting application", e);
-      throw e;
-    } 
-
-    context.setQueue(context.getQueue() == null ? "default" : context.getQueue());
-    context.setApplicationName(context.getApplicationName() == null ? "N/A" : context.getApplicationName());
-    amTracker.addMaster(user, context, clientTokenStr);
-    ApplicationMasterInfo masterInfo = amTracker.get(applicationId);
-    /** this can throw so we need to call it synchronously to let the client
-     * know as soon as it submits. For backwards compatibility we cannot make 
-     * it asynchronous
-     */
-    try {
-      scheduler.addApplication(applicationId, masterInfo.getMaster(), user, masterInfo.getQueue(),
-          context.getPriority(), masterInfo.getStore());
-    } catch(IOException io) {
-      LOG.info("Failed to submit application " + applicationId, io);
-      amTracker.finishNonRunnableApplication(applicationId);
-      throw io;
+  /* As of now we dont remove applications from the RM */
+  /* TODO we need to decide on a strategy for expiring done applications */
+  public void remove(ApplicationId applicationId) {
+    synchronized (rmContext.getApplications()) {
+      //applications.remove(applicationId);
+      this.amLivelinessMonitor.unRegister(applicationId);
     }
-    amTracker.runApplication(applicationId);
-    // TODO this should happen via dispatcher. should move it out to scheudler
-    // negotiator.
-    LOG.info("Application with id " + applicationId.getId() + " submitted by user " + 
-        user + " with " + context);
   }
 
   @Override
-  public void finishApplicationMaster(ApplicationMaster applicationMaster)
-  throws IOException {
-    amTracker.finish(applicationMaster);
-  }
+  public void recover(RMState state) {
 
-  /**
-   * check if the calling user has the access to application information.
-   * @param applicationId
-   * @param callerUGI
-   * @param owner
-   * @param appACL
-   * @return
-   */
-  private boolean checkAccess(UserGroupInformation callerUGI, String owner, ApplicationACL appACL) {
-      if (!UserGroupInformation.isSecurityEnabled()) {
-        return true;
+    for (Map.Entry<ApplicationId, ApplicationInfo> entry : state
+        .getStoredApplications().entrySet()) {
+      ApplicationId appId = entry.getKey();
+      ApplicationInfo appInfo = entry.getValue();
+      Application application = null;
+      try {
+        application = new ApplicationImpl(this.rmContext, getConfig(), appInfo
+            .getApplicationSubmissionContext().getUser(), appInfo
+            .getApplicationSubmissionContext(), appInfo
+            .getApplicationMaster().getClientToken(), this.rmContext
+            .getApplicationsStore().createApplicationStore(appId,
+                appInfo.getApplicationSubmissionContext()),
+            this.amLivelinessMonitor);
+      } catch (IOException ie) {
+        // ignore
       }
-      AccessControlList applicationACL = applicationACLs.get(appACL);
-      return aclsManager.checkAccess(callerUGI, appACL, owner, applicationACL);
-  }
-  
-  @Override
-  public synchronized void finishApplication(ApplicationId applicationId,
-      UserGroupInformation callerUGI) 
-  throws IOException {
-    ApplicationMasterInfo masterInfo = amTracker.get(applicationId);
-    if (!checkAccess(callerUGI, masterInfo.getUser(),  ApplicationACL.MODIFY_APP)) {
-      RPCUtil.getRemoteException(new AccessControlException("User "
-          + callerUGI.getShortUserName() + " cannot perform operation "
-          + ApplicationACL.MODIFY_APP.name() + " on " + applicationId));
+      ApplicationMaster master = application.getMaster();
+      ApplicationMaster storedAppMaster = appInfo.getApplicationMaster();
+      master.setAMFailCount(storedAppMaster.getAMFailCount());
+      master.setApplicationId(storedAppMaster.getApplicationId());
+      master.setClientToken(storedAppMaster.getClientToken());
+      master.setContainerCount(storedAppMaster.getContainerCount());
+      master.setTrackingUrl(storedAppMaster.getTrackingUrl());
+      master.setDiagnostics(storedAppMaster.getDiagnostics());
+      master.setHost(storedAppMaster.getHost());
+      master.setRpcPort(storedAppMaster.getRpcPort());
+      master.setStatus(storedAppMaster.getStatus());
+      master.setState(storedAppMaster.getState());
+      // TODO: Synchro? PutIfAbset?
+      this.rmContext.getApplications().put(appId, application);
+      this.rmContext.getDispatcher().getEventHandler().handle(
+          new ApplicationEvent(ApplicationEventType.RECOVER, appId));
     }
-    amTracker.kill(applicationId);
-  }
 
-  @Override
-  public  void applicationHeartbeat(ApplicationStatus status) 
-  throws IOException {
-    amTracker.heartBeat(status);
-  }
-
-  @Override
-  public  void registerApplicationMaster(ApplicationMaster applicationMaster)
-  throws IOException {
-    amTracker.registerMaster(applicationMaster);
- }
-
-  @Override
-  public  List<AppContext> getAllAppContexts() {
-    return amTracker.getAllApplications();
-  }
-
-  public  ApplicationMasterInfo getApplicationMasterInfo(ApplicationId
-      applicationId) {
-    return amTracker.get(applicationId);
-  }
-
-  @Override
-  public AppContext getAppContext(ApplicationId appId) {
-    return getApplicationMasterInfo(appId);
-  }
-  
-  private Application createApplication(AppContext context, String user,
-      String queue, String name, Container masterContainer) {
-    ApplicationMaster am = context.getMaster();
-    Application application = 
-      recordFactory.newRecordInstance(Application.class);
-    application.setApplicationId(am.getApplicationId());
-    application.setMasterContainer(masterContainer);
-    application.setTrackingUrl(am.getTrackingUrl());
-    application.setDiagnostics(am.getDiagnostics());
-    application.setName(name);
-    application.setQueue(queue);
-    application.setState(am.getState());
-    application.setStatus(am.getStatus());
-    application.setUser(user);
-    return application;
-  }
-  
-  @Override
-  public List<Application> getApplications() {
-    List<Application> apps = new ArrayList<Application>();
-    for (AppContext am: getAllAppContexts()) {
-      apps.add(createApplication(am, 
-          am.getUser(), am.getQueue(), am.getName(), am.getMasterContainer()));
-    }
-    return apps;
-  }
-
-  @Override
-  public Application getApplication(ApplicationId appID) {
-    ApplicationMasterInfo master = amTracker.get(appID);
-    return (master == null) ? null : createApplication(master,
-        master.getUser(), master.getQueue(), master.getName(),
-        master.getMasterContainer());
-  }
-
-
-  @Override
-  public void recover(RMState state) {
-    amTracker.recover(state);
   }
 }

+ 43 - 53
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/SchedulerNegotiator.java

@@ -31,21 +31,18 @@ import java.util.Map;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-import org.apache.hadoop.yarn.api.records.ApplicationStatus;
-import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.Container;
 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.event.EventHandler;
 import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMAllocatedEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.SNEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Allocation;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
 import org.apache.hadoop.yarn.service.AbstractService;
@@ -54,7 +51,7 @@ import org.apache.hadoop.yarn.service.AbstractService;
  * Negotiates with the scheduler for allocation of application master container.
  *
  */
-class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEvent<SNEventType>> {
+public class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEvent<SNEventType>> {
 
   private static final Log LOG = LogFactory.getLog(SchedulerNegotiator.class);
   private static final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
@@ -72,8 +69,8 @@ class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEve
 
   private final SchedulerThread schedulerThread;
   private final YarnScheduler scheduler;
-  private final List<AppContext> pendingApplications = 
-    new ArrayList<AppContext>();
+  private final List<Application> pendingApplications = 
+    new ArrayList<Application>();
 
   @SuppressWarnings("unchecked")
   public SchedulerNegotiator(RMContext context, 
@@ -114,11 +111,10 @@ class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEve
     
       @Override
     public void run() {
-      List<AppContext> toSubmit = 
-        new ArrayList<AppContext>();
-      List<AppContext> submittedApplications =
-        new ArrayList<AppContext>();
-      Map<ApplicationId, List<Container>> firstAllocate = new HashMap<ApplicationId, List<Container>>();
+      List<Application> toSubmit = new ArrayList<Application>();
+      List<Application> submittedApplications = new ArrayList<Application>();
+      Map<ApplicationId, List<Container>> firstAllocate 
+              = new HashMap<ApplicationId, List<Container>>();
       while (!shutdown && !isInterrupted()) {
         try {
           toSubmit.addAll(getPendingApplications());
@@ -127,7 +123,7 @@ class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEve
 
             submittedApplications.addAll(toSubmit);
 
-            for (AppContext masterInfo: toSubmit) {
+            for (Application masterInfo: toSubmit) {
               // Register request for the ApplicationMaster container
               ResourceRequest request = 
                 org.apache.hadoop.yarn.server.resourcemanager.resource.ResourceRequest.create(
@@ -150,10 +146,10 @@ class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEve
 
           List<Container> containers = null;
 
-          for (Iterator<AppContext> it=submittedApplications.iterator(); 
+          for (Iterator<Application> it=submittedApplications.iterator(); 
           it.hasNext();) {
-            AppContext masterInfo = it.next();
-            ApplicationId appId = masterInfo.getMaster().getApplicationId();
+            Application application = it.next();
+            ApplicationId appId = application.getMaster().getApplicationId();
             containers = scheduler.allocate(appId, 
                 EMPTY_ASK, EMPTY_RELEASE).getContainers();
             if (firstAllocate.containsKey(appId)) {
@@ -167,12 +163,13 @@ class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEve
               Container container = containers.get(0);
               
               LOG.info("Found container " + container + " for AM of "
-                  + masterInfo.getMaster());
-              handler.handle(new ApplicationMasterAllocatedEvent(masterInfo
+                  + application.getMaster());
+              handler.handle(new AMAllocatedEvent(application
                   .getApplicationID(), container));
             }
           }
 
+          // TODO: This can be detrimental. Use wait/notify.
           Thread.sleep(1000);
         } catch(Exception e) {
           LOG.info("Exception in submitting applications ", e);
@@ -189,8 +186,8 @@ class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEve
     }
   }
 
-  private Collection<? extends AppContext> getPendingApplications() {
-    List<AppContext> pending = new ArrayList<AppContext>();
+  private Collection<? extends Application> getPendingApplications() {
+    List<Application> pending = new ArrayList<Application>();
     synchronized (pendingApplications) {
       pending.addAll(pendingApplications);
       pendingApplications.clear();
@@ -198,52 +195,45 @@ class SchedulerNegotiator extends AbstractService implements EventHandler<ASMEve
     return pending;
   }
 
-  private void addPending(AppContext masterInfo) {
-    LOG.info("Adding to pending " + masterInfo.getMaster());
+  private void addPending(Application application) {
+    LOG.info("Adding to pending " + application.getApplicationID());
     synchronized(pendingApplications) {
-      pendingApplications.add(masterInfo);
+      pendingApplications.add(application);
     }
   }
 
+  private void finishApplication(Application application)  
+  throws IOException {
+    LOG.info("Finishing application: cleaning up container " +
+        application.getMasterContainer());
+    //TODO we should release the container but looks like we just 
+    // wait for update from NodeManager
+    Container[] containers = new Container[] {application.getMasterContainer()};
+    scheduler.allocate(application.getApplicationID(), 
+        EMPTY_ASK, Arrays.asList(containers));
+  }
+
   @Override
   public void handle(ASMEvent<SNEventType> appEvent)  {
-    SNEventType event = appEvent.getType();
-    AppContext appContext = appEvent.getAppContext();
-    switch (event) {
+    SNEventType eventType = appEvent.getType();
+    Application application = appEvent.getApplication();
+    switch (eventType) {
     case SCHEDULE:
-      addPending(appContext);
+      addPending(application);
       break;
     case RELEASE:
       try {
-      scheduler.allocate(appContext.getApplicationID(), 
-          EMPTY_ASK, Collections.singletonList(appContext.getMasterContainer()));
+        finishApplication(application);
       } catch(IOException ie) {
         //TODO remove IOException from the scheduler.
-        LOG.error("Error while releasing container for AM " + appContext.getApplicationID());
-      }
-      handler.handle(new ApplicationMasterInfoEvent(
-          ApplicationEventType.RELEASED, appContext.getApplicationID()));
-      break;
-    case CLEANUP:
-      try {
-        finishApplication(appContext);
-      } catch (IOException ie) {
-        LOG.info("Error finishing application", ie);
+        LOG.error("Error while releasing container for AM " + application.getApplicationID());
       }
+      handler.handle(new ApplicationEvent(
+          ApplicationEventType.RELEASED, application.getApplicationID()));
       break;
     default:
+      LOG.warn("Unknown event " + eventType + " received. Ignoring.");
       break;
     }
   }
-  
-  private void finishApplication(AppContext masterInfo)  
-  throws IOException {
-    LOG.info("Finishing application: cleaning up container " +
-        masterInfo.getMasterContainer());
-    //TODO we should release the container but looks like we just 
-    // wait for update from NodeManager
-    Container[] containers = new Container[] {masterInfo.getMasterContainer()};
-    scheduler.allocate(masterInfo.getMaster().getApplicationId(), 
-        EMPTY_ASK, Arrays.asList(containers));
-  }  
 }

+ 4 - 5
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterAllocatedEvent.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMAllocatedEvent.java

@@ -16,18 +16,17 @@
 * limitations under the License.
 */
 
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
 
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.Container;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
 
-public class ApplicationMasterAllocatedEvent extends
-    ApplicationMasterInfoEvent {
+public class AMAllocatedEvent extends
+    ApplicationEvent {
 
   private final Container masterContainer;
 
-  public ApplicationMasterAllocatedEvent(ApplicationId applicationId,
+  public AMAllocatedEvent(ApplicationId applicationId,
       Container masterContainer) {
     super(ApplicationEventType.ALLOCATED, applicationId);
     this.masterContainer = masterContainer;

+ 16 - 5
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationFinishEvent.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMFinishEvent.java

@@ -16,22 +16,33 @@
 * limitations under the License.
 */
 
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
 
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
 
-public class ApplicationFinishEvent extends ApplicationMasterInfoEvent {
+public class AMFinishEvent extends ApplicationEvent {
   private final ApplicationState finalState;
+  private final String trackingUrl;
+  private final String diagnostics;
 
-  public ApplicationFinishEvent(ApplicationId applicationId,
-      ApplicationState finalState) {
+  public AMFinishEvent(ApplicationId applicationId,
+      ApplicationState finalState, String trackingUrl, String diagnostics) {
     super(ApplicationEventType.FINISH, applicationId);
     this.finalState = finalState;
+    this.trackingUrl = trackingUrl;
+    this.diagnostics = diagnostics;
   }
 
   public ApplicationState getFinalApplicationState() {
     return this.finalState;
   }
+
+  public String getTrackingUrl() {
+    return this.trackingUrl;
+  }
+
+  public String getDiagnostics() {
+    return this.diagnostics;
+  }
 }

+ 24 - 0
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMLauncherEventType.java

@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
+
+public enum AMLauncherEventType {
+  LAUNCH,
+  CLEANUP
+}

+ 4 - 5
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterRegistrationEvent.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMRegistrationEvent.java

@@ -16,17 +16,16 @@
 * limitations under the License.
 */
 
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
 
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
 
-public class ApplicationMasterRegistrationEvent extends
-    ApplicationMasterInfoEvent {
+public class AMRegistrationEvent extends
+    ApplicationEvent {
 
   private final ApplicationMaster applicationMaster;
 
-  public ApplicationMasterRegistrationEvent(ApplicationMaster applicationMaster) {
+  public AMRegistrationEvent(ApplicationMaster applicationMaster) {
     super(ApplicationEventType.REGISTERED, applicationMaster
         .getApplicationId());
     this.applicationMaster = applicationMaster;

+ 4 - 5
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterStatusUpdateEvent.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/AMStatusUpdateEvent.java

@@ -16,17 +16,16 @@
 * limitations under the License.
 */
 
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
 
 import org.apache.hadoop.yarn.api.records.ApplicationStatus;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
 
-public class ApplicationMasterStatusUpdateEvent extends
-    ApplicationMasterInfoEvent {
+public class AMStatusUpdateEvent extends
+    ApplicationEvent {
 
   private final ApplicationStatus applicationStatus;
 
-  public ApplicationMasterStatusUpdateEvent(ApplicationStatus applicationStatus) {
+  public AMStatusUpdateEvent(ApplicationStatus applicationStatus) {
     super(ApplicationEventType.STATUSUPDATE, applicationStatus
         .getApplicationId());
     this.applicationStatus = applicationStatus;

+ 6 - 6
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ASMEvent.java

@@ -19,21 +19,21 @@
 package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
 
 import org.apache.hadoop.yarn.event.AbstractEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AppContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
 
 public class ASMEvent<T extends Enum<T>> extends AbstractEvent<T> {
-  private final AppContext context;
+  private final Application application;
   
-  public ASMEvent(T type, AppContext context) {
+  public ASMEvent(T type, Application app) {
     super(type);
-    this.context = context;
+    this.application = app;
   }
   
   /** 
    * return the application context.
    * @return the application context for this event.
    */
-  public AppContext getAppContext() {
-    return this.context;
+  public Application getApplication() {
+    return this.application;
   }
 }

+ 3 - 4
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfoEvent.java → mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationEvent.java

@@ -16,18 +16,17 @@
 * limitations under the License.
 */
 
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
 
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.event.AbstractEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
 
-public class ApplicationMasterInfoEvent extends
+public class ApplicationEvent extends
     AbstractEvent<ApplicationEventType> {
 
   private final ApplicationId applicationId;
 
-  public ApplicationMasterInfoEvent(ApplicationEventType type,
+  public ApplicationEvent(ApplicationEventType type,
       ApplicationId applicationId) {
     super(type);
     this.applicationId = applicationId;

+ 54 - 0
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationEventType.java

@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
+
+public enum ApplicationEventType {
+
+  // Source: ApplicationMasterService -> ASM -> AMTracker-self
+  REGISTERED,
+  STATUSUPDATE,
+  FINISH, // Also by AMLauncher
+
+  // Source: SchedulerNegotiator.
+  ALLOCATED,
+  RELEASED,
+
+  // Source: ASM -> AMTracker
+  ALLOCATE, // Also AMTracker->Self
+  FAILED,
+  RECOVER,
+
+  // TODO: Nobody Uses!
+  REMOVE,
+  CLEANUP,
+
+  // Source: AMLauncher
+  LAUNCHED,
+  LAUNCH_FAILED,
+
+  // Source: AMTracker: Self-event
+  LAUNCH,
+  FAILED_MAX_RETRIES,
+
+  // Source: AMLivelinessMonitor -> AMTracker
+  EXPIRE,
+
+  // Source: ClientRMService -> ASM -> AMTracker
+  KILL
+}

+ 0 - 37
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationFinishEvent.java

@@ -1,37 +0,0 @@
-/**
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
-
-import org.apache.hadoop.yarn.api.records.ApplicationState;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AppContext;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-
-public class ApplicationFinishEvent extends ASMEvent<ApplicationEventType> {
-  private final ApplicationState finalState;
-
-  public ApplicationFinishEvent(AppContext context,
-      ApplicationState finalState) {
-    super(ApplicationEventType.FINISH, context);
-    this.finalState = finalState;
-  }
-
-  public ApplicationState getFinalApplicationState() {
-    return this.finalState;
-  }
-}

+ 0 - 83
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java

@@ -1,83 +0,0 @@
-/**
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
-
-import org.apache.hadoop.classification.InterfaceAudience.Private;
-import org.apache.hadoop.classification.InterfaceStability.Evolving;
-
-/**
- * The events for application master that are generated within the applications
- * manager.
- */
-@Private
-@Evolving
-public class ApplicationMasterEvents {
-  public enum SNEventType {
-    SCHEDULE,
-    RELEASE,
-    CLEANUP
-  };
-
-  public enum AMLauncherEventType {
-    LAUNCH,
-    CLEANUP
-  };
-
-  /* event generated for components tracking application adding/tracking/removal */
-  public enum ApplicationTrackerEventType {
-    ADD,
-    REMOVE,
-    EXPIRE
-  }
-  
-  public enum ApplicationEventType {
-
-    // Source: ApplicationMasterService -> ASM -> AMTracker-self
-    REGISTERED,
-    STATUSUPDATE,
-    FINISH, // Also by AMLauncher
-
-    // Source: SchedulerNegotiator.
-    ALLOCATED,
-    RELEASED,
-
-    // Source: ASM -> AMTracker
-    ALLOCATE, // Also AMTracker->Self
-    FAILED,
-    RECOVER,
-
-    // TODO: Nobody Uses!
-    REMOVE,
-    CLEANUP,
-
-    // Source: AMLauncher
-    LAUNCHED,
-    LAUNCH_FAILED,
-
-    // Source: AMTracker: Self-event
-    LAUNCH,
-    FAILED_MAX_RETRIES,
-
-    // Source: AMLivelinessMonitor -> AMTracker
-    EXPIRE,
-
-    // Source: ClientRMService -> ASM -> AMTracker
-    KILL
-  };
-}

+ 25 - 0
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationTrackerEventType.java

@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
+
+public enum ApplicationTrackerEventType {
+  ADD,
+  REMOVE,
+  EXPIRE
+}

+ 24 - 0
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/SNEventType.java

@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events;
+
+public enum SNEventType {
+  SCHEDULE,
+  RELEASE,
+}

+ 3 - 3
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/Application.java

@@ -470,9 +470,9 @@ public class Application {
     return new ArrayList<NodeInfo>(applicationOnNodes);
   }
 
-  synchronized public org.apache.hadoop.yarn.api.records.Application getApplicationInfo() {
-    org.apache.hadoop.yarn.api.records.Application application = recordFactory
-        .newRecordInstance(org.apache.hadoop.yarn.api.records.Application.class);
+  synchronized public org.apache.hadoop.yarn.api.records.ApplicationReport getApplicationInfo() {
+    org.apache.hadoop.yarn.api.records.ApplicationReport application = recordFactory
+        .newRecordInstance(org.apache.hadoop.yarn.api.records.ApplicationReport.class);
     application.setApplicationId(applicationId);
     application.setName("");
     application.setQueue(queue.getQueueName());

+ 1 - 1
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/ResourceScheduler.java

@@ -25,7 +25,7 @@ import org.apache.hadoop.classification.InterfaceStability.Evolving;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Recoverable;
 import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.ClusterTracker;
 import org.apache.hadoop.yarn.server.security.ContainerTokenSecretManager;

+ 3 - 3
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacityScheduler.java

@@ -51,7 +51,7 @@ import org.apache.hadoop.yarn.api.records.Resource;
 import org.apache.hadoop.yarn.api.records.ResourceRequest;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.resource.Resources;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.ApplicationInfo;
@@ -586,7 +586,7 @@ implements ResourceScheduler, CapacitySchedulerContext {
       break;
     case REMOVE:
       try {
-        doneApplication(event.getAppContext().getApplicationID(), true);
+        doneApplication(event.getApplication().getApplicationID(), true);
       } catch(IOException ie) {
         LOG.error("Error in removing 'done' application", ie);
         //TODO have to be shutdown the RM in case of this.
@@ -598,7 +598,7 @@ implements ResourceScheduler, CapacitySchedulerContext {
         /** do not remove the application. Just do everything else exception 
          * removing the application
          */
-        doneApplication(event.getAppContext().getApplicationID(), false);
+        doneApplication(event.getApplication().getApplicationID(), false);
       } catch(IOException ie) {
         LOG.error("Error in removing 'expired' application", ie);
         //TODO have to be shutdown the RM in case of this.

+ 4 - 4
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java

@@ -90,7 +90,7 @@ public class LeafQueue implements Queue {
   private final QueueMetrics metrics;
 
   private QueueInfo queueInfo; 
-  private Map<ApplicationId, org.apache.hadoop.yarn.api.records.Application> 
+  private Map<ApplicationId, org.apache.hadoop.yarn.api.records.ApplicationReport> 
   applicationInfos;
 
   private QueueState state;
@@ -141,7 +141,7 @@ public class LeafQueue implements Queue {
 
     this.applicationInfos = 
       new HashMap<ApplicationId, 
-      org.apache.hadoop.yarn.api.records.Application>();
+      org.apache.hadoop.yarn.api.records.ApplicationReport>();
 
     QueueState state = cs.getConfiguration().getState(getQueuePath());
 
@@ -298,11 +298,11 @@ public class LeafQueue implements Queue {
 
     if (includeApplications) {
       queueInfo.setApplications( 
-          new ArrayList<org.apache.hadoop.yarn.api.records.Application>(
+          new ArrayList<org.apache.hadoop.yarn.api.records.ApplicationReport>(
               applicationInfos.values()));
     } else {
       queueInfo.setApplications(
-          new ArrayList<org.apache.hadoop.yarn.api.records.Application>());
+          new ArrayList<org.apache.hadoop.yarn.api.records.ApplicationReport>());
     }
 
     return queueInfo;

+ 4 - 4
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java

@@ -86,7 +86,7 @@ public class ParentQueue implements Queue {
   private final QueueMetrics metrics;
 
   private QueueInfo queueInfo; 
-  private Map<ApplicationId, org.apache.hadoop.yarn.api.records.Application> 
+  private Map<ApplicationId, org.apache.hadoop.yarn.api.records.ApplicationReport> 
   applicationInfos;
 
   private Map<QueueACL, AccessControlList> acls = 
@@ -146,7 +146,7 @@ public class ParentQueue implements Queue {
 
     this.applicationInfos = 
       new HashMap<ApplicationId, 
-      org.apache.hadoop.yarn.api.records.Application>();
+      org.apache.hadoop.yarn.api.records.ApplicationReport>();
 
 
     LOG.info("Initialized parent-queue " + queueName + 
@@ -292,11 +292,11 @@ public class ParentQueue implements Queue {
 
     if (includeApplications) {
       queueInfo.setApplications( 
-        new ArrayList<org.apache.hadoop.yarn.api.records.Application>(
+        new ArrayList<org.apache.hadoop.yarn.api.records.ApplicationReport>(
             applicationInfos.values()));
     } else {
       queueInfo.setApplications(
-          new ArrayList<org.apache.hadoop.yarn.api.records.Application>());
+          new ArrayList<org.apache.hadoop.yarn.api.records.ApplicationReport>());
     }
 
     List<QueueInfo> childQueuesInfo = new ArrayList<QueueInfo>();

+ 9 - 9
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java

@@ -53,7 +53,7 @@ import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.security.ContainerTokenIdentifier;
 import org.apache.hadoop.yarn.server.resourcemanager.RMConfig;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.ApplicationInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.RMState;
@@ -135,7 +135,7 @@ public class FifoScheduler implements ResourceScheduler {
         queueInfo.setApplications(getApplications());
       } else {
         queueInfo.setApplications(
-            new ArrayList<org.apache.hadoop.yarn.api.records.Application>());
+            new ArrayList<org.apache.hadoop.yarn.api.records.ApplicationReport>());
       }
       return queueInfo;
     }
@@ -577,16 +577,16 @@ public class FifoScheduler implements ResourceScheduler {
       break;
     case REMOVE:
       try {
-        doneApplication(event.getAppContext().getApplicationID(), true);
+        doneApplication(event.getApplication().getApplicationID(), true);
       } catch(IOException ie) {
-        LOG.error("Unable to remove application " + event.getAppContext().getApplicationID(), ie);
+        LOG.error("Unable to remove application " + event.getApplication().getApplicationID(), ie);
       }
       break;  
     case EXPIRE:
       try {
-        doneApplication(event.getAppContext().getApplicationID(), false);
+        doneApplication(event.getApplication().getApplicationID(), false);
       } catch(IOException ie) {
-        LOG.error("Unable to remove application " + event.getAppContext().getApplicationID(), ie);
+        LOG.error("Unable to remove application " + event.getApplication().getApplicationID(), ie);
       }
       break;
     }
@@ -618,10 +618,10 @@ public class FifoScheduler implements ResourceScheduler {
     return DEFAULT_QUEUE.getQueueUserAclInfo(null); 
   }
 
-  private synchronized List<org.apache.hadoop.yarn.api.records.Application> 
+  private synchronized List<org.apache.hadoop.yarn.api.records.ApplicationReport> 
   getApplications() {
-    List<org.apache.hadoop.yarn.api.records.Application> applications = 
-      new ArrayList<org.apache.hadoop.yarn.api.records.Application>();
+    List<org.apache.hadoop.yarn.api.records.ApplicationReport> applications = 
+      new ArrayList<org.apache.hadoop.yarn.api.records.ApplicationReport>();
     for (Application application : this.applications.values()) {
       applications.add(application.getApplicationInfo());
     }

+ 2 - 2
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppsBlock.java

@@ -20,7 +20,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.webapp;
 
 import com.google.inject.Inject;
 
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AppContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
 import org.apache.hadoop.yarn.util.Apps;
 import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
 import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.*;
@@ -52,7 +52,7 @@ class AppsBlock extends HtmlBlock {
             th(".note", "Note")._()._().
         tbody();
     int i = 0;
-    for (AppContext app : list.apps) {
+    for (Application app : list.apps.values()) {
       String appId = Apps.toString(app.getApplicationID());
       String trackingUrl = app.getMaster().getTrackingUrl();
       String ui = trackingUrl == null || trackingUrl.isEmpty() ? "UNASSIGNED" :

+ 19 - 14
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppsList.java

@@ -18,38 +18,43 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager.webapp;
 
-import com.google.inject.Inject;
-import com.google.inject.servlet.RequestScoped;
+import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
+import static org.apache.commons.lang.StringEscapeUtils.escapeJavaScript;
+import static org.apache.hadoop.yarn.webapp.view.Jsons._SEP;
+import static org.apache.hadoop.yarn.webapp.view.Jsons.appendLink;
+import static org.apache.hadoop.yarn.webapp.view.Jsons.appendProgressBar;
+import static org.apache.hadoop.yarn.webapp.view.Jsons.appendSortable;
 
 import java.io.PrintWriter;
-import java.util.List;
+import java.util.concurrent.ConcurrentMap;
 
-import static org.apache.commons.lang.StringEscapeUtils.*;
-import static org.apache.hadoop.yarn.webapp.view.JQueryUI.*;
-import static org.apache.hadoop.yarn.webapp.view.Jsons.*;
-
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AppContext;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationsManager;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
 import org.apache.hadoop.yarn.util.Apps;
-import org.apache.hadoop.yarn.webapp.ToJSON;
 import org.apache.hadoop.yarn.webapp.Controller.RequestContext;
+import org.apache.hadoop.yarn.webapp.ToJSON;
+import org.apache.hadoop.yarn.webapp.view.JQueryUI.Render;
+
+import com.google.inject.Inject;
+import com.google.inject.servlet.RequestScoped;
 
 // So we only need to do asm.getApplications once in a request
 @RequestScoped
 class AppsList implements ToJSON {
   final RequestContext rc;
-  final List<AppContext> apps;
+  final ConcurrentMap<ApplicationId, Application> apps;
   Render rendering;
 
-  @Inject AppsList(RequestContext ctx, ApplicationsManager asm) {
+  @Inject AppsList(RequestContext ctx, RMContext rmContext) {
     rc = ctx;
-    apps = asm.getAllAppContexts();
+    apps = rmContext.getApplications();
   }
 
   void toDataTableArrays(PrintWriter out) {
     out.append('[');
     boolean first = true;
-    for (AppContext app : apps) {
+    for (Application app : apps.values()) {
       if (first) {
         first = false;
       } else {

+ 3 - 1
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebApp.java

@@ -18,8 +18,9 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager.webapp;
 
+import org.apache.hadoop.yarn.server.resourcemanager.ApplicationsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationsManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.ClusterTracker;
 import org.apache.hadoop.yarn.webapp.WebApp;
 
@@ -42,6 +43,7 @@ public class RMWebApp extends WebApp {
   public void setup() {
     if (rm != null) {
       bind(ResourceManager.class).toInstance(rm);
+      bind(RMContext.class).toInstance(rm.getRMContext());
       bind(ApplicationsManager.class).toInstance(rm.getApplicationsManager());
       bind(ClusterTracker.class).toInstance(rm.getResourceTracker());
     }

+ 7 - 7
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java

@@ -22,23 +22,23 @@ import static org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebApp.APP_
 import static org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebApp.QUEUE_NAME;
 import static org.apache.hadoop.yarn.util.StringHelper.join;
 
+import org.apache.hadoop.util.StringUtils;
 import org.apache.hadoop.util.VersionInfo;
-import org.apache.hadoop.yarn.util.YarnVersionInfo;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.Container;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationsManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
 import org.apache.hadoop.yarn.util.Apps;
 import org.apache.hadoop.yarn.util.ConverterUtils;
 import org.apache.hadoop.yarn.util.Times;
+import org.apache.hadoop.yarn.util.YarnVersionInfo;
 import org.apache.hadoop.yarn.webapp.Controller;
 import org.apache.hadoop.yarn.webapp.ResponseInfo;
 
 import com.google.inject.Inject;
-import org.apache.hadoop.util.StringUtils;
-import org.apache.hadoop.yarn.api.records.Container;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.AppContext;
 
 // Do NOT rename/refactor this to RMView as it will wreak havoc
 // on Mac OS HFS as its case-insensitive!
@@ -70,8 +70,8 @@ public class RmController extends Controller {
       return;
     }
     ApplicationId appID = Apps.toAppID(aid);
-    ApplicationsManager asm = getInstance(ApplicationsManager.class);
-    AppContext app = asm.getAppContext(appID);
+    RMContext context = getInstance(RMContext.class);
+    Application app = context.getApplications().get(appID);
     if (app == null) {
       // TODO: handle redirect to jobhistory server
       setStatus(response().SC_NOT_FOUND);

+ 6 - 2
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/Application.java

@@ -36,6 +36,7 @@ import org.apache.hadoop.classification.InterfaceAudience.Private;
 import org.apache.hadoop.net.NetworkTopology;
 import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.Container;
@@ -99,7 +100,7 @@ public class Application {
     this.queue = queue;
     this.resourceManager = resourceManager;
     this.applicationId =
-      this.resourceManager.getApplicationsManager().getNewApplicationID();
+      this.resourceManager.getClientRMService().getNewApplicationId();
   }
 
   public String getUser() {
@@ -131,7 +132,10 @@ public class Application {
     context.setApplicationId(this.applicationId);
     context.setUser(this.user);
     context.setQueue(this.queue);
-    resourceManager.getApplicationsManager().submitApplication(context);
+    SubmitApplicationRequest request = recordFactory
+        .newRecordInstance(SubmitApplicationRequest.class);
+    request.setApplicationSubmissionContext(context);
+    resourceManager.getClientRMService().submitApplication(request);
   }
   
   public synchronized void addResourceRequestSpec(

+ 26 - 59
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/MockAsm.java

@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.security.UserGroupInformation;
-import org.apache.hadoop.yarn.api.records.Application;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.MockApps;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
@@ -34,8 +34,11 @@ import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.Container;
 import org.apache.hadoop.yarn.api.records.ContainerId;
 import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ApplicationsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.RMState;
+import org.apache.hadoop.yarn.service.AbstractService;
 import org.apache.hadoop.yarn.util.Records;
 
 @InterfaceAudience.Private
@@ -144,55 +147,29 @@ public abstract class MockAsm extends MockApps {
     }
   }
 
-  public static class AsmBase implements ApplicationsManager {
-    @Override
-    public ApplicationId getNewApplicationID() {
-      throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public ApplicationMaster getApplicationMaster(ApplicationId applicationId) {
-      throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public Application getApplication(ApplicationId applicationID) {
-      throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public AppContext getAppContext(ApplicationId appId) {
-      throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void submitApplication(ApplicationSubmissionContext context) throws IOException {
-      throw new UnsupportedOperationException("Not supported yet.");
-    }
-
-    @Override
-    public void finishApplication(ApplicationId applicationId,
-                                  UserGroupInformation callerUGI) throws IOException {
-      throw new UnsupportedOperationException("Not supported yet.");
+  public static class AsmBase extends AbstractService implements
+      ApplicationsManager {
+    public AsmBase() {
+      super(AsmBase.class.getName());
     }
 
     @Override
-    public List<AppContext> getAllAppContexts() {
+    public void recover(RMState state) throws Exception {
       throw new UnsupportedOperationException("Not supported yet.");
     }
 
     @Override
-    public List<Application> getApplications() {
-      throw new UnsupportedOperationException("Not supported yet.");
+    public AMLivelinessMonitor getAmLivelinessMonitor() {
+      return null;
     }
 
     @Override
-    public void recover(RMState state) throws Exception {
-      throw new UnsupportedOperationException("Not supported yet.");
+    public ClientToAMSecretManager getClientToAMSecretManager() {
+      return null;
     }
   }
 
-  public static class AppContextBase implements AppContext {
+  public static class ApplicationBase implements Application {
     @Override
     public ApplicationSubmissionContext getSubmissionContext() {
       throw new UnsupportedOperationException("Not supported yet.");
@@ -257,6 +234,11 @@ public abstract class MockAsm extends MockApps {
     public long getFinishTime() {
       throw new UnsupportedOperationException("Not supported yet.");
     }
+
+    @Override
+    public ApplicationState getState() {
+      throw new UnsupportedOperationException("Not supported yet.");
+    }
   }
 
   public static ApplicationMaster newAppMaster(final ApplicationId id) {
@@ -288,7 +270,7 @@ public abstract class MockAsm extends MockApps {
     };
   }
 
-  public static AppContext newAppContext(int i) {
+  public static Application newApplication(int i) {
     final ApplicationId id = newAppID(i);
     final ApplicationMaster master = newAppMaster(id);
     final Container masterContainer = Records.newRecord(Container.class);
@@ -303,7 +285,7 @@ public abstract class MockAsm extends MockApps {
     final long start = System.currentTimeMillis() - (int)(Math.random()*DT);
     final long finish = Math.random() < 0.5 ? 0 :
         System.currentTimeMillis() + (int)(Math.random()*DT);
-    return new AppContextBase() {
+    return new ApplicationBase() {
       @Override
       public ApplicationId getApplicationID() {
         return id;
@@ -351,30 +333,15 @@ public abstract class MockAsm extends MockApps {
     };
   }
   
-  public static List<AppContext> newAppContexts(int n) {
-    List<AppContext> list = Lists.newArrayList();
+  public static List<Application> newApplications(int n) {
+    List<Application> list = Lists.newArrayList();
     for (int i = 0; i < n; ++i) {
-      list.add(newAppContext(i));
+      list.add(newApplication(i));
     }
     return list;
   }
 
-  public static ApplicationsManager create(int n) {
-    final List<AppContext> apps = newAppContexts(n);
-    final Map<ApplicationId, AppContext> map = Maps.newHashMap();
-    for (AppContext app : apps) {
-      map.put(app.getApplicationID(), app);
-    }
-    return new AsmBase() {
-      @Override
-      public List<AppContext> getAllAppContexts() {
-        return apps;
-      }
-
-      @Override
-      public AppContext getAppContext(ApplicationId id) {
-        return map.get(id);
-      }
-    };
+  public static ApplicationsManager create() {
+    return new AsmBase();
   }
 }

+ 32 - 15
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMLaunchFailure.java

@@ -28,8 +28,10 @@ import junit.framework.Assert;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.Container;
@@ -43,13 +45,15 @@ import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ClientRMService;
 import org.apache.hadoop.yarn.server.resourcemanager.RMConfig;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
 import org.apache.hadoop.yarn.server.resourcemanager.resource.Resources;
@@ -67,6 +71,7 @@ public class TestAMLaunchFailure {
   YarnScheduler scheduler = new DummyYarnScheduler();
   ApplicationTokenSecretManager applicationTokenSecretManager = 
     new ApplicationTokenSecretManager();
+  private ClientRMService clientService;
 
   private RMContext context;
 
@@ -131,7 +136,7 @@ public class TestAMLaunchFailure {
 
     private  class DummyApplicationMasterLauncher implements EventHandler<ASMEvent<AMLauncherEventType>> {
       private AtomicInteger notify = new AtomicInteger();
-      private AppContext app;
+      private Application app;
 
       public DummyApplicationMasterLauncher(RMContext context) {
         context.getDispatcher().register(AMLauncherEventType.class, this);
@@ -142,7 +147,7 @@ public class TestAMLaunchFailure {
         switch(appEvent.getType()) {
         case LAUNCH:
           LOG.info("LAUNCH called ");
-          app = appEvent.getAppContext();
+          app = appEvent.getApplication();
           synchronized (notify) {
             notify.addAndGet(1);
             notify.notify();
@@ -162,7 +167,7 @@ public class TestAMLaunchFailure {
               e.printStackTrace();
             }
             context.getDispatcher().getEventHandler().handle(
-                new ApplicationMasterInfoEvent(ApplicationEventType.LAUNCHED,
+                new ApplicationEvent(ApplicationEventType.LAUNCHED,
                     app.getApplicationID()));
           }
         }
@@ -187,9 +192,18 @@ public class TestAMLaunchFailure {
   public void setUp() {
     context = new ResourceManager.RMContextImpl(new MemStore());
     Configuration conf = new Configuration();
+
+    context.getDispatcher().register(ApplicationEventType.class,
+        new ResourceManager.ApplicationEventDispatcher(context));
+
     context.getDispatcher().init(conf);
     context.getDispatcher().start();
+
     asmImpl = new ExtApplicationsManagerImpl(applicationTokenSecretManager, scheduler);
+    clientService = new ClientRMService(context, asmImpl
+        .getAmLivelinessMonitor(), asmImpl.getClientToAMSecretManager(),
+        null, scheduler);
+    clientService.init(conf);
     new DummyApplicationTracker();
     conf.setLong(YarnConfiguration.AM_EXPIRY_INTERVAL, 3000L);
     conf.setInt(RMConfig.AM_MAX_RETRIES, 1);
@@ -210,17 +224,20 @@ public class TestAMLaunchFailure {
 
   @Test
   public void testAMLaunchFailure() throws Exception {
-    ApplicationId appID = asmImpl.getNewApplicationID();
-    ApplicationSubmissionContext context = createDummyAppContext(appID);
-    asmImpl.submitApplication(context);
-    ApplicationMaster master = asmImpl.getApplicationMaster(appID);
-
-    while (master.getState() != ApplicationState.FAILED) {
+    ApplicationId appID = clientService.getNewApplicationId();
+    ApplicationSubmissionContext submissionContext = createDummyAppContext(appID);
+    SubmitApplicationRequest request = recordFactory
+        .newRecordInstance(SubmitApplicationRequest.class);
+    request.setApplicationSubmissionContext(submissionContext);
+    clientService.submitApplication(request);
+    Application application = context.getApplications().get(appID); 
+
+    while (application.getState() != ApplicationState.FAILED) {
       LOG.info("Waiting for application to go to FAILED state."
-          + " Current state is " + master.getState());
+          + " Current state is " + application.getState());
       Thread.sleep(200);
-      master = asmImpl.getApplicationMaster(appID);
+      application = context.getApplications().get(appID);
     }
-    Assert.assertEquals(ApplicationState.FAILED, master.getState());
+    Assert.assertEquals(ApplicationState.FAILED, application.getState());
   }
 }

+ 19 - 16
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCResponseId.java

@@ -27,6 +27,7 @@ import junit.framework.Assert;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.records.AMResponse;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
@@ -42,8 +43,10 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ApplicationMasterService;
+import org.apache.hadoop.yarn.server.resourcemanager.ClientRMService;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Allocation;
@@ -57,6 +60,7 @@ public class TestAMRMRPCResponseId {
   ApplicationMasterService amService = null;
   ApplicationTokenSecretManager appTokenManager = new ApplicationTokenSecretManager();
   DummyApplicationsManager applicationsManager;
+  private ClientRMService clientService;
   DummyScheduler scheduler;
   private final static Container[] EMPTY_CONTAINER_ARRAY = new Container[] {};
   private final static List<Container> EMPTY_CONTAINER_LIST = Arrays.asList(EMPTY_CONTAINER_ARRAY);
@@ -68,18 +72,6 @@ public class TestAMRMRPCResponseId {
         YarnScheduler scheduler, RMContext asmContext) {
       super(applicationTokenSecretManager, scheduler, asmContext);      
     }
-    @Override
-    public void registerApplicationMaster(ApplicationMaster applicationMaster)
-    throws IOException {
-    }
-    @Override
-    public void applicationHeartbeat(ApplicationStatus status)
-    throws IOException {      
-    }
-    @Override
-    public void finishApplicationMaster(ApplicationMaster applicationMaster)
-    throws IOException {  
-    }
   }
   
   
@@ -130,12 +122,20 @@ public class TestAMRMRPCResponseId {
   @Before
   public void setUp() {
     context = new ResourceManager.RMContextImpl(new MemStore());
+
+    context.getDispatcher().register(ApplicationEventType.class,
+        new ResourceManager.ApplicationEventDispatcher(context));
+
     scheduler = new DummyScheduler();
     applicationsManager = new DummyApplicationsManager(new 
         ApplicationTokenSecretManager(), scheduler, context);
-    amService = new ApplicationMasterService(
-        appTokenManager, applicationsManager, scheduler, context);
     Configuration conf = new Configuration();
+    this.clientService = new ClientRMService(context, applicationsManager
+        .getAmLivelinessMonitor(), applicationsManager
+        .getClientToAMSecretManager(), null, scheduler);
+    this.clientService.init(conf);
+    amService = new ApplicationMasterService(appTokenManager, scheduler,
+        context);
     applicationsManager.init(conf);
     amService.init(conf);
     context.getDispatcher().init(conf);
@@ -149,10 +149,13 @@ public class TestAMRMRPCResponseId {
 
   @Test
   public void testARRMResponseId() throws Exception {
-    ApplicationId applicationID = applicationsManager.getNewApplicationID();
+    ApplicationId applicationID = clientService.getNewApplicationId();
     ApplicationSubmissionContext context = recordFactory.newRecordInstance(ApplicationSubmissionContext.class);
     context.setApplicationId(applicationID);
-    applicationsManager.submitApplication(context);
+    SubmitApplicationRequest submitRequest = recordFactory
+        .newRecordInstance(SubmitApplicationRequest.class);
+    submitRequest.setApplicationSubmissionContext(context);
+    clientService.submitApplication(submitRequest);
     ApplicationMaster applicationMaster = recordFactory.newRecordInstance(ApplicationMaster.class);
     applicationMaster.setApplicationId(applicationID);
     applicationMaster.setStatus(recordFactory.newRecordInstance(ApplicationStatus.class));

+ 27 - 12
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRestart.java

@@ -12,6 +12,7 @@ import junit.framework.Assert;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
@@ -29,13 +30,15 @@ import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ClientRMService;
 import org.apache.hadoop.yarn.server.resourcemanager.RMConfig;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.RMState;
@@ -61,6 +64,7 @@ public class TestAMRestart {
   ApplicationTokenSecretManager appTokenSecretManager = 
     new ApplicationTokenSecretManager();
   DummyResourceScheduler scheduler;
+  private ClientRMService clientRMService;
   int count = 0;
   ApplicationId appID;
   final int maxFailures = 3;
@@ -71,7 +75,6 @@ public class TestAMRestart {
   int schedulerRemoveApplication = 0;
   int launcherLaunchCalled = 0;
   int launcherCleanupCalled = 0;
-  ApplicationMasterInfo masterInfo;
   private final static RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
   
   private class ExtApplicationsManagerImpl extends ApplicationsManagerImpl {
@@ -104,7 +107,7 @@ public class TestAMRestart {
                 }
               }
               asmContext.getDispatcher().getEventHandler().handle(
-                  new ApplicationMasterInfoEvent(
+                  new ApplicationEvent(
                       ApplicationEventType.LAUNCHED, appID));
               launchNotify.addAndGet(-1);
             }
@@ -226,6 +229,10 @@ public class TestAMRestart {
 
   @Before
   public void setUp() {
+
+    asmContext.getDispatcher().register(ApplicationEventType.class,
+        new ResourceManager.ApplicationEventDispatcher(asmContext));
+
     appID = recordFactory.newRecordInstance(ApplicationId.class);
     appID.setClusterTimestamp(System.currentTimeMillis());
     appID.setId(1);
@@ -240,20 +247,25 @@ public class TestAMRestart {
     conf.setInt(RMConfig.AM_MAX_RETRIES, maxFailures);
     appImpl.init(conf);
     appImpl.start();
+
+    this.clientRMService = new ClientRMService(asmContext, appImpl
+        .getAmLivelinessMonitor(), appImpl.getClientToAMSecretManager(),
+        null, scheduler); 
+    this.clientRMService.init(conf);
   }
 
   @After
   public void tearDown() {
   }
 
-  private void waitForFailed(ApplicationMasterInfo masterInfo, ApplicationState 
+  private void waitForFailed(Application application, ApplicationState 
       finalState) throws Exception {
     int count = 0;
-    while(masterInfo.getState() != finalState && count < 10) {
+    while(application.getState() != finalState && count < 10) {
       Thread.sleep(500);
       count++;
     }
-    Assert.assertEquals(finalState, masterInfo.getState());
+    Assert.assertEquals(finalState, application.getState());
   }
 
   @Test
@@ -265,8 +277,11 @@ public class TestAMRestart {
 //    subContext.environment = new HashMap<String, String>();
 //    subContext.fsTokens = new ArrayList<String>();
     subContext.setFsTokensTodo(ByteBuffer.wrap(new byte[0]));
-    appImpl.submitApplication(subContext);
-    masterInfo = appImpl.getApplicationMasterInfo(appID);
+    SubmitApplicationRequest request = recordFactory
+        .newRecordInstance(SubmitApplicationRequest.class);
+    request.setApplicationSubmissionContext(subContext);
+    clientRMService.submitApplication(request);
+    Application application = asmContext.getApplications().get(appID); 
     synchronized (schedulerNotify) {
       while(schedulerNotify.get() == 0) {
         schedulerNotify.wait();
@@ -276,8 +291,8 @@ public class TestAMRestart {
     Assert.assertEquals(maxFailures, launcherLaunchCalled);
     Assert.assertEquals(maxFailures, schedulerAddApplication);
     Assert.assertEquals(maxFailures, schedulerRemoveApplication);
-    Assert.assertEquals(maxFailures, masterInfo.getFailedCount());
-    waitForFailed(masterInfo, ApplicationState.FAILED);
+    Assert.assertEquals(maxFailures, application.getFailedCount());
+    waitForFailed(application, ApplicationState.FAILED);
     stop = true;
   }
 }

+ 28 - 23
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestASMStateMachine.java

@@ -34,11 +34,16 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMFinishEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMAllocatedEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMRegistrationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMStatusUpdateEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.SNEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.StoreFactory;
 import org.junit.After;
@@ -75,7 +80,7 @@ public class TestASMStateMachine {
   }
 
   private class DummyAMLaunchEventHandler implements EventHandler<ASMEvent<AMLauncherEventType>> {
-    AppContext appcontext;
+    Application application;
     AtomicInteger amsync = new AtomicInteger(0);
 
     public DummyAMLaunchEventHandler() {
@@ -87,10 +92,10 @@ public class TestASMStateMachine {
       switch(event.getType()) {
       case LAUNCH:
         launchCalled = true;
-        appcontext = event.getAppContext();
+        application = event.getApplication();
         context.getDispatcher().getEventHandler().handle(
-            new ApplicationMasterInfoEvent(ApplicationEventType.LAUNCHED,
-                appcontext.getApplicationID()));
+            new ApplicationEvent(ApplicationEventType.LAUNCHED,
+                application.getApplicationID()));
         break;
       case CLEANUP:
         launchCleanupCalled = true;
@@ -100,7 +105,7 @@ public class TestASMStateMachine {
   }
 
   private class DummySNEventHandler implements EventHandler<ASMEvent<SNEventType>> {
-    AppContext appContext;
+    Application application;
     AtomicInteger snsync = new AtomicInteger(0);
 
     public DummySNEventHandler() {
@@ -110,15 +115,15 @@ public class TestASMStateMachine {
     @Override
     public void handle(ASMEvent<SNEventType> event) {
       switch(event.getType()) {
-      case CLEANUP:
+      case RELEASE:
         snreceivedCleanUp = true;
         break;
       case SCHEDULE:
         snAllocateReceived = true;
-        appContext = event.getAppContext();
+        application = event.getApplication();
         context.getDispatcher().getEventHandler().handle(
-            new ApplicationMasterAllocatedEvent(appContext.getApplicationID(),
-                appContext.getMasterContainer()));
+            new AMAllocatedEvent(application.getApplicationID(),
+                application.getMasterContainer()));
         break;
       }
     }
@@ -144,19 +149,19 @@ public class TestASMStateMachine {
   }
 
   private class MockAppplicationMasterInfo implements
-      EventHandler<ApplicationMasterInfoEvent> {
+      EventHandler<ApplicationEvent> {
 
     MockAppplicationMasterInfo() {
       context.getDispatcher().register(ApplicationEventType.class, this);
     }
     @Override
-    public void handle(ApplicationMasterInfoEvent event) {
+    public void handle(ApplicationEvent event) {
       LOG.info("The event type is " + event.getType());
     }
   }
 
   private void waitForState( ApplicationState 
-      finalState, ApplicationMasterInfo masterInfo) throws Exception {
+      finalState, ApplicationImpl masterInfo) throws Exception {
     int count = 0;
     while(masterInfo.getState() != finalState && count < 10) {
       Thread.sleep(500);
@@ -175,13 +180,13 @@ public class TestASMStateMachine {
     submissioncontext.getApplicationId().setId(1);
     submissioncontext.getApplicationId().setClusterTimestamp(System.currentTimeMillis());
 
-    ApplicationMasterInfo masterInfo = new ApplicationMasterInfo(context,
+    ApplicationImpl masterInfo = new ApplicationImpl(context,
         conf, "dummyuser", submissioncontext, "dummyToken", StoreFactory
             .createVoidAppStore(), new AMLivelinessMonitor(context
             .getDispatcher().getEventHandler()));
 
     context.getDispatcher().register(ApplicationEventType.class, masterInfo);
-    handler.handle(new ApplicationMasterInfoEvent(
+    handler.handle(new ApplicationEvent(
         ApplicationEventType.ALLOCATE, submissioncontext.getApplicationId()));
 
     waitForState(ApplicationState.LAUNCHED, masterInfo);
@@ -189,21 +194,21 @@ public class TestASMStateMachine {
     Assert.assertTrue(launchCalled);
     Assert.assertTrue(addedApplication);
     handler
-        .handle(new ApplicationMasterRegistrationEvent(masterInfo.getMaster()));
+        .handle(new AMRegistrationEvent(masterInfo.getMaster()));
     waitForState(ApplicationState.RUNNING, masterInfo);
     Assert.assertEquals(ApplicationState.RUNNING, masterInfo.getState());
 
     ApplicationStatus status = recordFactory
         .newRecordInstance(ApplicationStatus.class);
     status.setApplicationId(masterInfo.getApplicationID());
-    handler.handle(new ApplicationMasterStatusUpdateEvent(status));
+    handler.handle(new AMStatusUpdateEvent(status));
 
     /* check if the state is still RUNNING */
 
     Assert.assertEquals(ApplicationState.RUNNING, masterInfo.getState());
 
-    handler.handle(new ApplicationFinishEvent(masterInfo.getApplicationID(),
-        ApplicationState.COMPLETED));
+    handler.handle(new AMFinishEvent(masterInfo.getApplicationID(),
+        ApplicationState.COMPLETED, "", ""));
     waitForState(ApplicationState.COMPLETED, masterInfo);
     Assert.assertEquals(ApplicationState.COMPLETED, masterInfo.getState());
     /* check if clean up is called for everyone */
@@ -212,7 +217,7 @@ public class TestASMStateMachine {
     Assert.assertTrue(removedApplication);
 
     /* check if expiry doesnt make it failed */
-    handler.handle(new ApplicationMasterInfoEvent(ApplicationEventType.EXPIRE,
+    handler.handle(new ApplicationEvent(ApplicationEventType.EXPIRE,
         masterInfo.getApplicationID()));
     Assert.assertEquals(ApplicationState.COMPLETED, masterInfo.getState());   
   }

+ 37 - 25
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationCleanup.java

@@ -34,6 +34,7 @@ import org.apache.hadoop.net.NetworkTopology;
 import org.apache.hadoop.net.Node;
 import org.apache.hadoop.net.NodeBase;
 import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
@@ -46,13 +47,16 @@ import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ClientRMService;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMAllocatedEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.SNEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
 import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.NodeInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.NodeInfoTracker;
@@ -83,6 +87,7 @@ public class TestApplicationCleanup {
   private static final int memoryNeeded = 100;
 
   private final RMContext context = new ResourceManager.RMContextImpl(new MemStore());
+  private ClientRMService clientService;
   private TestRMResourceTrackerImpl clusterTracker;
 
   private class TestRMResourceTrackerImpl extends RMResourceTrackerImpl {
@@ -115,6 +120,9 @@ public class TestApplicationCleanup {
     context.getDispatcher().start();
     asm = new ExtASM(new ApplicationTokenSecretManager(), scheduler);
     asm.init(conf);
+    clientService = new ClientRMService(context,
+        asm.getAmLivelinessMonitor(), asm.getClientToAMSecretManager(),
+        clusterTracker, scheduler);
   }
 
   @After
@@ -142,7 +150,7 @@ public class TestApplicationCleanup {
 
     private class DummyApplicationMasterLauncher implements EventHandler<ASMEvent<AMLauncherEventType>> {
       private AtomicInteger notify = new AtomicInteger(0);
-      private AppContext appContext;
+      private Application application;
 
       public DummyApplicationMasterLauncher(RMContext context) {
         context.getDispatcher().register(AMLauncherEventType.class, this);
@@ -158,10 +166,10 @@ public class TestApplicationCleanup {
         case LAUNCH:
           LOG.info("Launcher Launch called");
           launcherLaunchCalled = true;
-          appContext = appEvent.getAppContext();
+          application = appEvent.getApplication();
           context.getDispatcher().getEventHandler().handle(
-              new ApplicationMasterInfoEvent(ApplicationEventType.LAUNCHED,
-                  appContext.getApplicationID()));
+              new ApplicationEvent(ApplicationEventType.LAUNCHED,
+                  application.getApplicationID()));
           break;
         default:
           break;
@@ -171,7 +179,7 @@ public class TestApplicationCleanup {
 
     private class DummySchedulerNegotiator implements EventHandler<ASMEvent<SNEventType>> {
       private AtomicInteger snnotify = new AtomicInteger(0);
-      AppContext acontext;
+      Application application;
       public  DummySchedulerNegotiator(RMContext context) {
         context.getDispatcher().register(SNEventType.class, this);
       }
@@ -180,15 +188,15 @@ public class TestApplicationCleanup {
       public void handle(ASMEvent<SNEventType> appEvent) {
         SNEventType event = appEvent.getType();
         switch (event) {
-        case CLEANUP:
+        case RELEASE:
           schedulerCleanupCalled = true;
           break;
         case SCHEDULE:
           schedulerScheduleCalled = true;
-          acontext = appEvent.getAppContext();
+          application = appEvent.getApplication();
           context.getDispatcher().getEventHandler().handle(
-              new ApplicationMasterAllocatedEvent(acontext.getApplicationID(),
-                  acontext.getMasterContainer()));
+              new AMAllocatedEvent(application.getApplicationID(),
+                  application.getMasterContainer()));
         default:
           break;
         }
@@ -215,13 +223,13 @@ public class TestApplicationCleanup {
   }
 
   private void waitForState(ApplicationState 
-      finalState, ApplicationMasterInfo masterInfo) throws Exception {
+      finalState, Application application) throws Exception {
     int count = 0;
-    while(masterInfo.getState() != finalState && count < 10) {
+    while(application.getState() != finalState && count < 10) {
       Thread.sleep(500);
       count++;
     }
-    Assert.assertEquals(finalState, masterInfo.getState());
+    Assert.assertEquals(finalState, application.getState());
   }
 
 
@@ -249,13 +257,17 @@ public class TestApplicationCleanup {
 
   @Test
   public void testApplicationCleanUp() throws Exception {
-    ApplicationId appID = asm.getNewApplicationID();
-    ApplicationSubmissionContext context = recordFactory.newRecordInstance(ApplicationSubmissionContext.class);
-    context.setApplicationId(appID);
-    context.setQueue("queuename");
-    context.setUser("dummyuser");
-    asm.submitApplication(context);
-    waitForState(ApplicationState.LAUNCHED, asm.getApplicationMasterInfo(appID));
+    ApplicationId appID = clientService.getNewApplicationId();
+    ApplicationSubmissionContext submissionContext = recordFactory.newRecordInstance(ApplicationSubmissionContext.class);
+    submissionContext.setApplicationId(appID);
+    submissionContext.setQueue("queuename");
+    submissionContext.setUser("dummyuser");
+    SubmitApplicationRequest request = recordFactory
+        .newRecordInstance(SubmitApplicationRequest.class);
+    request.setApplicationSubmissionContext(submissionContext);
+    clientService.submitApplication(request);
+    waitForState(ApplicationState.LAUNCHED, context.getApplications().get(
+        appID));
     List<ResourceRequest> reqs = new ArrayList<ResourceRequest>();
     ResourceRequest req = createNewResourceRequest(100, 1);
     reqs.add(req);
@@ -279,8 +291,8 @@ public class TestApplicationCleanup {
     /* only allocate the containers to the first node */
     Assert.assertEquals((firstNodeMemory - (2 * memoryNeeded)), firstNode
         .getAvailableResource().getMemory());
-    ApplicationMasterInfo masterInfo = asm.getApplicationMasterInfo(appID);
-    asm.finishApplication(appID, UserGroupInformation.getCurrentUser());
+    context.getDispatcher().getEventHandler().handle(
+        new ApplicationEvent(ApplicationEventType.KILL, appID));
     while (asm.launcherCleanupCalled != true) {
       Thread.sleep(500);
     }

+ 43 - 31
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterExpiry.java

@@ -34,13 +34,15 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMAllocatedEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.SNEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.SNEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
-import org.junit.After;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -51,28 +53,26 @@ import org.junit.Test;
 public class TestApplicationMasterExpiry {
   private static final Log LOG = LogFactory.getLog(TestApplicationMasterExpiry.class);
   private static RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null);
-  AMTracker tracker;
   
   private final RMContext context = new ResourceManager.RMContextImpl(new MemStore());
+  private AMLivelinessMonitor amLivelinessMonitor;
   
   @Before
   public void setUp() {
     new DummyApplicationTracker();
     new DummySN();
     new DummyLauncher();
-    new ApplicationEventTypeListener();
-    tracker = new AMTracker(context); 
+    new ApplicationEventTypeListener(); 
     Configuration conf = new Configuration();
+    context.getDispatcher().register(ApplicationEventType.class,
+        new ResourceManager.ApplicationEventDispatcher(context));
     context.getDispatcher().init(conf);
     context.getDispatcher().start();
     conf.setLong(YarnConfiguration.AM_EXPIRY_INTERVAL, 1000L);
-    tracker.init(conf);
-    tracker.start();
-  }
-  
-  @After 
-  public void tearDown() {
-    tracker.stop();
+    amLivelinessMonitor = new AMLivelinessMonitor(this.context
+        .getDispatcher().getEventHandler());
+    amLivelinessMonitor.init(conf);
+    amLivelinessMonitor.start();
   }
   
   private class DummyApplicationTracker implements EventHandler<ASMEvent<ApplicationTrackerEventType>> {
@@ -88,12 +88,12 @@ public class TestApplicationMasterExpiry {
   private boolean expired = false;
   
   private class ApplicationEventTypeListener implements
-      EventHandler<ApplicationMasterInfoEvent> {
+      EventHandler<ApplicationEvent> {
     ApplicationEventTypeListener() {
       context.getDispatcher().register(ApplicationEventType.class, this);
     }
     @Override
-    public void handle(ApplicationMasterInfoEvent event) {
+    public void handle(ApplicationEvent event) {
       switch(event.getType()) {
       case EXPIRE:
         expired = true;
@@ -123,14 +123,14 @@ public class TestApplicationMasterExpiry {
     }
   }
   
-  private void waitForState(ApplicationMasterInfo masterInfo, ApplicationState 
+  private void waitForState(Application application, ApplicationState 
       finalState) throws Exception {
     int count = 0;
-    while(masterInfo.getState() != finalState && count < 10) {
+    while(application.getState() != finalState && count < 10) {
       Thread.sleep(500);
       count++;
     }
-    Assert.assertEquals(finalState, masterInfo.getState());
+    Assert.assertEquals(finalState, application.getState());
   }
 
   @Test
@@ -142,19 +142,31 @@ public class TestApplicationMasterExpiry {
     submissionContext.getApplicationId().setClusterTimestamp(
         System.currentTimeMillis());
     submissionContext.getApplicationId().setId(1);
-    
-    tracker.addMaster(
-        "dummy", 
-        submissionContext, "dummytoken");
-    ApplicationMasterInfo masterInfo = tracker.get(submissionContext.getApplicationId());
-    tracker.runApplication(submissionContext.getApplicationId());
+
+    ApplicationStore appStore = context.getApplicationsStore()
+    .createApplicationStore(submissionContext.getApplicationId(),
+        submissionContext);
+    Application application = new ApplicationImpl(context,
+        new Configuration(), "dummy", submissionContext, "dummytoken", appStore,
+        amLivelinessMonitor);
+    context.getApplications()
+        .put(application.getApplicationID(), application);
+
+    this.context.getDispatcher().getSyncHandler().handle(
+        new ApplicationEvent(ApplicationEventType.ALLOCATE, submissionContext
+            .getApplicationId()));
+
+    waitForState(application, ApplicationState.ALLOCATING);
+
     this.context.getDispatcher().getEventHandler().handle(
-        new ApplicationMasterAllocatedEvent(masterInfo.getApplicationID(),
-            masterInfo.getMasterContainer()));
-    waitForState(masterInfo, ApplicationState.LAUNCHING);
+        new AMAllocatedEvent(application.getApplicationID(),
+            application.getMasterContainer()));
+
+    waitForState(application, ApplicationState.LAUNCHING);
+
     this.context.getDispatcher().getEventHandler().handle(
-        new ApplicationMasterInfoEvent(ApplicationEventType.LAUNCHED,
-            masterInfo.getApplicationID()));
+        new ApplicationEvent(ApplicationEventType.LAUNCHED,
+            application.getApplicationID()));
     synchronized(expiry) {
       while (expiry.get() == 0) {
         expiry.wait(1000);

+ 10 - 8
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterLauncher.java

@@ -35,9 +35,11 @@ import org.apache.hadoop.yarn.security.ApplicationTokenSecretManager;
 import org.apache.hadoop.yarn.security.client.ClientToAMSecretManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMFinishEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.StoreFactory;
 import org.junit.After;
@@ -65,9 +67,9 @@ public class TestApplicationMasterLauncher {
 
   private Configuration conf = new Configuration();
   
-  private class DummyASM implements EventHandler<ApplicationMasterInfoEvent> {
+  private class DummyASM implements EventHandler<ApplicationEvent> {
     @Override
-    public void handle(ApplicationMasterInfoEvent appEvent) {
+    public void handle(ApplicationEvent appEvent) {
       ApplicationEventType event = appEvent.getType();
       switch (event) {
       case FINISH:
@@ -96,8 +98,8 @@ public class TestApplicationMasterLauncher {
     }
     public void run() {
       cleanedUp.incrementAndGet();
-      asmHandle.handle(new ApplicationFinishEvent(null,
-          ApplicationState.COMPLETED));
+      asmHandle.handle(new AMFinishEvent(null,
+          ApplicationState.COMPLETED, "", ""));
     }
   }
 
@@ -112,7 +114,7 @@ public class TestApplicationMasterLauncher {
     }
 
     @Override
-    protected Runnable createRunnableLauncher(AppContext masterInfo, 
+    protected Runnable createRunnableLauncher(Application masterInfo, 
         AMLauncherEventType event) {
       Runnable r = null;
       switch (event) {
@@ -152,7 +154,7 @@ public class TestApplicationMasterLauncher {
     submissionContext.getApplicationId().setClusterTimestamp(System.currentTimeMillis());
     submissionContext.getApplicationId().setId(1);
     submissionContext.setUser("dummyuser");
-    ApplicationMasterInfo masterInfo = new ApplicationMasterInfo(this.context,
+    ApplicationImpl masterInfo = new ApplicationImpl(this.context,
         this.conf, "dummyuser", submissionContext, "dummyclienttoken",
         StoreFactory.createVoidAppStore(), new AMLivelinessMonitor(context
             .getDispatcher().getEventHandler()));

+ 8 - 7
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestSchedulerNegotiator.java

@@ -42,10 +42,11 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ASMEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationTrackerEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationTrackerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.Store.RMState;
@@ -67,7 +68,7 @@ public class TestSchedulerNegotiator {
   private final int testNum = 99999;
   
   private final RMContext context = new ResourceManager.RMContextImpl(new MemStore());
-  ApplicationMasterInfo masterInfo;
+  ApplicationImpl masterInfo;
   private EventHandler handler;
   private Configuration conf = new Configuration();
   private class DummyScheduler implements ResourceScheduler {
@@ -166,7 +167,7 @@ public class TestSchedulerNegotiator {
     schedulerNegotiator.stop();
   }
   
-  public void waitForState(ApplicationState state, ApplicationMasterInfo info) {
+  public void waitForState(ApplicationState state, ApplicationImpl info) {
     int count = 0;
     while (info.getState() != state && count < 100) {
       try {
@@ -192,7 +193,7 @@ public class TestSchedulerNegotiator {
     submissionContext.getApplicationId().setClusterTimestamp(System.currentTimeMillis());
     submissionContext.getApplicationId().setId(1);
     
-    masterInfo = new ApplicationMasterInfo(this.context, this.conf, "dummy",
+    masterInfo = new ApplicationImpl(this.context, this.conf, "dummy",
         submissionContext, "dummyClientToken", StoreFactory
             .createVoidAppStore(), new AMLivelinessMonitor(context
             .getDispatcher().getEventHandler()));
@@ -200,7 +201,7 @@ public class TestSchedulerNegotiator {
     context.getDispatcher().register(ApplicationTrackerEventType.class, scheduler);
     context.getDispatcher().register(AMLauncherEventType.class,
         new DummyEventHandler());
-    handler.handle(new ApplicationMasterInfoEvent(
+    handler.handle(new ApplicationEvent(
         ApplicationEventType.ALLOCATE, submissionContext.getApplicationId()));
     waitForState(ApplicationState.LAUNCHING, masterInfo); // LAUNCHING because ALLOCATED automatically movesto LAUNCHING for now.
     Container container = masterInfo.getMasterContainer();

+ 40 - 13
mapreduce/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebApp.java

@@ -18,30 +18,40 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager.webapp;
 
-import com.google.inject.Injector;
+import static org.apache.hadoop.test.MockitoMaker.make;
+import static org.apache.hadoop.test.MockitoMaker.stub;
+import static org.apache.hadoop.yarn.server.resourcemanager.MockNodes.newResource;
+import static org.apache.hadoop.yarn.webapp.Params.TITLE;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
 
-import static org.apache.hadoop.test.MockitoMaker.*;
-import static org.apache.hadoop.yarn.server.resourcemanager.MockNodes.*;
-import static org.apache.hadoop.yarn.webapp.Params.*;
-
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.server.resourcemanager.ApplicationsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
-import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.ApplicationsManager;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContext;
+import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.RMContextImpl;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.MockAsm;
+import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemStore;
+import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.ClusterTracker;
 import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.NodeInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.RMResourceTrackerImpl;
-import org.apache.hadoop.yarn.server.resourcemanager.resourcetracker.ClusterTracker;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration;
 import org.apache.hadoop.yarn.webapp.WebApps;
 import org.apache.hadoop.yarn.webapp.test.WebAppTests;
-
 import org.junit.Test;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.inject.Injector;
 
 public class TestRMWebApp {
   static final int GiB = 1024; // MiB
@@ -54,8 +64,8 @@ public class TestRMWebApp {
   }
 
   @Test public void testView() {
-    Injector injector = WebAppTests.createMockInjector(ApplicationsManager.class,
-                                                       MockAsm.create(3));
+    Injector injector = WebAppTests.createMockInjector(RMContext.class,
+                                                       mockRMContext(3));
     injector.getInstance(RmView.class).render();
     WebAppTests.flushOutput(injector);
   }
@@ -73,16 +83,33 @@ public class TestRMWebApp {
         getAllNodeInfo());
   }
 
+  public static RMContext mockRMContext(int n) {
+    final List<Application> apps = MockAsm.newApplications(n);
+    final ConcurrentMap<ApplicationId, Application> map = Maps
+        .newConcurrentMap();
+    for (Application app : apps) {
+      map.put(app.getApplicationID(), app);
+    }
+    return new RMContextImpl(new MemStore()) {
+      @Override
+      public ConcurrentMap<ApplicationId, Application> getApplications() {
+        return map;
+      }
+    };
+  }
+
   public static ResourceManager mockRm(int apps, int racks, int nodes,
                                        int mbsPerNode)
   throws Exception {
     ResourceManager rm = mock(ResourceManager.class);
-    ApplicationsManager asm = MockAsm.create(apps);
+    ApplicationsManager asm = MockAsm.create();
+    RMContext rmContext = mockRMContext(apps);
     RMResourceTrackerImpl rt = mockResource(racks, nodes, mbsPerNode);
     ResourceScheduler rs = mockCapacityScheduler();
     when(rm.getApplicationsManager()).thenReturn(asm);
     when(rm.getResourceTracker()).thenReturn(rt);
     when(rm.getResourceScheduler()).thenReturn(rs);
+    when(rm.getRMContext()).thenReturn(rmContext);
     return rm;
   }
 

+ 9 - 5
mapreduce/yarn/yarn-server/yarn-server-tests/src/test/java/org/apache/hadoop/yarn/server/TestContainerTokenSecretManager.java

@@ -52,7 +52,8 @@ import org.apache.hadoop.yarn.api.ContainerManager;
 import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.GetContainerStatusRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterRequest;
-import org.apache.hadoop.yarn.api.records.Application;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
+import org.apache.hadoop.yarn.api.records.ApplicationReport;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationMaster;
 import org.apache.hadoop.yarn.api.records.ApplicationState;
@@ -79,6 +80,7 @@ import org.apache.hadoop.yarn.security.ContainerManagerSecurityInfo;
 import org.apache.hadoop.yarn.security.ContainerTokenIdentifier;
 import org.apache.hadoop.yarn.security.SchedulerSecurityInfo;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.Application;
 import org.apache.hadoop.yarn.util.ConverterUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -154,18 +156,20 @@ public class TestContainerTokenSecretManager {
     rsrc.setType(LocalResourceType.FILE);
     rsrc.setVisibility(LocalResourceVisibility.PRIVATE);
     appSubmissionContext.setResourceTodo("testFile", rsrc);
-    resourceManager.getApplicationsManager().submitApplication(
-        appSubmissionContext);
+    SubmitApplicationRequest submitRequest = recordFactory
+        .newRecordInstance(SubmitApplicationRequest.class);
+    submitRequest.setApplicationSubmissionContext(appSubmissionContext);
+    resourceManager.getClientRMService().submitApplication(submitRequest);
 
     // Wait till container gets allocated for AM
     int waitCounter = 0;
     Application app =
-        resourceManager.getApplicationsManager().getApplication(appID);
+        resourceManager.getRMContext().getApplications().get(appID);
     while (app.getState() != ApplicationState.LAUNCHED && waitCounter <= 20) {
       Thread.sleep(1000);
       LOG.info("Waiting for AM to be allocated a container. Current state is "
           + app.getState());
-      app = resourceManager.getApplicationsManager().getApplication(appID);
+      app = resourceManager.getRMContext().getApplications().get(appID);
     }
 
     Assert.assertTrue(ApplicationState.PENDING != app.getState());