Fixing the bug which was causing FAILED jobs to be displayed as COMPLETED on the RM UI. (vinodkv)


git-svn-id: https://svn.apache.org/repos/asf/hadoop/mapreduce/branches/MR-279@1134898 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index ed48674..3d4bf9c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -5,6 +5,9 @@
 
     MAPREDUCE-279
 
+    Fixing the bug which was causing FAILED jobs to be displayed as COMPLETED
+    on the RM UI. (vinodkv)
+
     Fixing broken link to logs for container on NM web UI. (vinodkv)
 
     Miscellaneous UI fixes + source code formatting for
diff --git a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLauncher.java b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLauncher.java
index 55e4334..55cb3d0 100644
--- a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLauncher.java
+++ b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMLauncher.java
@@ -47,6 +47,7 @@
 import org.apache.hadoop.yarn.api.protocolrecords.StartContainerRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.StopContainerRequest;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.api.records.Container;
 import org.apache.hadoop.yarn.api.records.ContainerId;
@@ -64,6 +65,7 @@
 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.ApplicationFinishEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.AMLauncherEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationMasterEvents.ApplicationEventType;
 
@@ -271,7 +273,8 @@
       } catch(IOException ie) {
         LOG.info("Error cleaning master ", ie);
       }
-      handler.handle(new ASMEvent<ApplicationEventType>(ApplicationEventType.FINISH, master));
+      handler.handle(new ApplicationFinishEvent(master,
+          ApplicationState.COMPLETED)); // Doesn't matter what state you send :) :(
       break;
     default:
       break;
diff --git a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMTracker.java b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMTracker.java
index 156af0d..f3ba69a 100644
--- a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMTracker.java
+++ b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/AMTracker.java
@@ -46,6 +46,7 @@
 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.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationFinishEvent;
 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;
@@ -261,8 +262,9 @@
     masterInfo.getMaster().setDiagnostics(
         remoteApplicationMaster.getDiagnostics());
 
-    rmContext.getDispatcher().getSyncHandler().handle(new ASMEvent<ApplicationEventType>(
-        ApplicationEventType.FINISH, masterInfo));
+    rmContext.getDispatcher().getSyncHandler().handle(
+        new ApplicationFinishEvent(masterInfo, remoteApplicationMaster
+            .getState()));
   }
 
   public ApplicationMasterInfo get(ApplicationId applicationId) {
diff --git a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java
index b490a56..288ce3a 100644
--- a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java
+++ b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/ApplicationMasterInfo.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.EnumSet;
 import java.util.List;
 
 import org.apache.commons.logging.Log;
@@ -38,12 +39,14 @@
 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.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationFinishEvent;
 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.recovery.ApplicationsStore.ApplicationStore;
 import org.apache.hadoop.yarn.state.InvalidStateTransitonException;
+import org.apache.hadoop.yarn.state.MultipleArcTransition;
 import org.apache.hadoop.yarn.state.SingleArcTransition;
 import org.apache.hadoop.yarn.state.StateMachine;
 import org.apache.hadoop.yarn.state.StateMachineFactory;
@@ -93,125 +96,108 @@
   <ApplicationMasterInfo, ApplicationState, ApplicationEventType, ASMEvent<ApplicationEventType>>
   (ApplicationState.PENDING)
 
+  // Transitions from PENDING State
   .addTransition(ApplicationState.PENDING, ApplicationState.ALLOCATING,
-  ApplicationEventType.ALLOCATE, allocateTransition)
-  
+      ApplicationEventType.ALLOCATE, allocateTransition)
   .addTransition(ApplicationState.PENDING, ApplicationState.FAILED,
-  ApplicationEventType.FAILED)
-  
-  .addTransition(ApplicationState.PENDING, ApplicationState.KILLED, 
-  ApplicationEventType.KILL)
-
-  .addTransition(ApplicationState.PENDING, ApplicationState.ALLOCATING, 
+      ApplicationEventType.FAILED)
+  .addTransition(ApplicationState.PENDING, ApplicationState.KILLED,
+      ApplicationEventType.KILL)
+  .addTransition(ApplicationState.PENDING, ApplicationState.ALLOCATING,
       ApplicationEventType.RECOVER, allocateTransition)
-    
-  .addTransition(ApplicationState.PENDING, ApplicationState.ALLOCATING, 
-  ApplicationEventType.RELEASED, new ScheduleTransition())
+  .addTransition(ApplicationState.PENDING, ApplicationState.ALLOCATING,
+      ApplicationEventType.RELEASED, new ScheduleTransition())
 
-  .addTransition(ApplicationState.EXPIRED_PENDING, ApplicationState.ALLOCATING, 
-  ApplicationEventType.ALLOCATE, allocateTransition)
-  
-  .addTransition(ApplicationState.EXPIRED_PENDING, ApplicationState.ALLOCATING,
-  ApplicationEventType.RECOVER, allocateTransition)
-  
-  .addTransition(ApplicationState.EXPIRED_PENDING, ApplicationState.FAILED,
-  ApplicationEventType.FAILED_MAX_RETRIES, failedTransition)
-  
-  .addTransition(ApplicationState.EXPIRED_PENDING, ApplicationState.KILLED,
-   ApplicationEventType.KILL, killTransition)
- 
+   // Transitions from ALLOCATING State
   .addTransition(ApplicationState.ALLOCATING, ApplicationState.ALLOCATED,
-  ApplicationEventType.ALLOCATED, new AllocatedTransition())
+      ApplicationEventType.ALLOCATED, new AllocatedTransition())
+  .addTransition(ApplicationState.ALLOCATING,
+      ApplicationState.ALLOCATING, ApplicationEventType.RECOVER,
+      allocateTransition)
+  .addTransition(ApplicationState.ALLOCATING, ApplicationState.KILLED,
+      ApplicationEventType.KILL, new AllocatingKillTransition())
 
-  .addTransition(ApplicationState.ALLOCATING, ApplicationState.ALLOCATING,
-  ApplicationEventType.RECOVER, allocateTransition)
-      
-  .addTransition(ApplicationState.ALLOCATING, ApplicationState.KILLED, 
-  ApplicationEventType.KILL, new AllocatingKillTransition())
-
-  .addTransition(ApplicationState.ALLOCATED, ApplicationState.KILLED, 
-  ApplicationEventType.KILL, killTransition)
-
+  // Transitions from ALLOCATED State
+  .addTransition(ApplicationState.ALLOCATED, ApplicationState.KILLED,
+      ApplicationEventType.KILL, killTransition)
   .addTransition(ApplicationState.ALLOCATED, ApplicationState.LAUNCHING,
-  ApplicationEventType.LAUNCH, launchTransition)
-
+      ApplicationEventType.LAUNCH, launchTransition)
   .addTransition(ApplicationState.ALLOCATED, ApplicationState.LAUNCHING,
-  ApplicationEventType.RECOVER, new RecoverLaunchTransition())
-      
+      ApplicationEventType.RECOVER, new RecoverLaunchTransition())
+
+  // Transitions from LAUNCHING State
   .addTransition(ApplicationState.LAUNCHING, ApplicationState.LAUNCHED,
-  ApplicationEventType.LAUNCHED, launchedTransition)
-  
+      ApplicationEventType.LAUNCHED, launchedTransition)
   .addTransition(ApplicationState.LAUNCHING, ApplicationState.PENDING,
-  ApplicationEventType.LAUNCH_FAILED, failedLaunchTransition)
-  
-  /** we cant say if the application was launched or not on a recovery, so for now 
-   * we assume it was launched and wait for its restart.
-   */
+      ApplicationEventType.LAUNCH_FAILED, failedLaunchTransition)
+  // We cant say if the application was launched or not on a recovery, so
+  // for now we assume it was launched and wait for its restart.
   .addTransition(ApplicationState.LAUNCHING, ApplicationState.LAUNCHED,
-  ApplicationEventType.RECOVER, new RecoverLaunchedTransition())
-  
+      ApplicationEventType.RECOVER, new RecoverLaunchedTransition())
   .addTransition(ApplicationState.LAUNCHING, ApplicationState.KILLED,
-   ApplicationEventType.KILL, killTransition)
-   
-  .addTransition(ApplicationState.LAUNCHED, ApplicationState.CLEANUP, 
-  ApplicationEventType.KILL, killTransition)
-  
+      ApplicationEventType.KILL, killTransition)
+
+  // Transitions from LAUNCHED State
+  .addTransition(ApplicationState.LAUNCHED, ApplicationState.CLEANUP,
+      ApplicationEventType.KILL, killTransition)
   .addTransition(ApplicationState.LAUNCHED, ApplicationState.FAILED,
-  ApplicationEventType.EXPIRE, expireTransition)
-  
-  .addTransition(ApplicationState.LAUNCHED, ApplicationState.RUNNING, 
-  ApplicationEventType.REGISTERED, new RegisterTransition())
-    
-  .addTransition(ApplicationState.LAUNCHED, ApplicationState.LAUNCHED,
-   ApplicationEventType.RECOVER)
-
-  /* for now we assume that acting on expiry is synchronous and we do not 
-   * have to wait for cleanup acks from scheduler negotiator and launcher.
-   */
-  .addTransition(ApplicationState.LAUNCHED, ApplicationState.EXPIRED_PENDING,
       ApplicationEventType.EXPIRE, expireTransition)
-      
-  .addTransition(ApplicationState.RUNNING,  ApplicationState.EXPIRED_PENDING, 
-  ApplicationEventType.EXPIRE, expireTransition)
-  
-  .addTransition(ApplicationState.RUNNING, ApplicationState.COMPLETED,
-  ApplicationEventType.FINISH, new DoneTransition())
+   .addTransition(ApplicationState.LAUNCHED, ApplicationState.RUNNING,
+      ApplicationEventType.REGISTERED, new RegisterTransition())
+  .addTransition(ApplicationState.LAUNCHED, ApplicationState.LAUNCHED,
+      ApplicationEventType.RECOVER)
+  // for now we assume that acting on expiry is synchronous and we do not
+  // have to wait for cleanup acks from scheduler negotiator and launcher.
+  .addTransition(ApplicationState.LAUNCHED,
+      ApplicationState.EXPIRED_PENDING, ApplicationEventType.EXPIRE,
+      expireTransition)
 
+  // Transitions from RUNNING State
+  .addTransition(ApplicationState.RUNNING,
+      ApplicationState.EXPIRED_PENDING, ApplicationEventType.EXPIRE,
+      expireTransition)
+  .addTransition(ApplicationState.RUNNING,
+      EnumSet.of(ApplicationState.COMPLETED, ApplicationState.FAILED),
+      ApplicationEventType.FINISH, new DoneTransition())
+      // TODO: For now, no KILLED above. As all kills come to RM directly.
   .addTransition(ApplicationState.RUNNING, ApplicationState.RUNNING,
-  ApplicationEventType.STATUSUPDATE, statusUpdatetransition)
-
+      ApplicationEventType.STATUSUPDATE, statusUpdatetransition)
   .addTransition(ApplicationState.RUNNING, ApplicationState.KILLED,
-   ApplicationEventType.KILL, killTransition)
-
+      ApplicationEventType.KILL, killTransition)
   .addTransition(ApplicationState.RUNNING, ApplicationState.RUNNING, 
-  ApplicationEventType.RECOVER, new RecoverRunningTransition())
-  
-  .addTransition(ApplicationState.COMPLETED, ApplicationState.COMPLETED, 
-  ApplicationEventType.EXPIRE)
+      ApplicationEventType.RECOVER, new RecoverRunningTransition())
 
+  // Transitions from EXPIRED_PENDING State
+  .addTransition(ApplicationState.EXPIRED_PENDING,
+      ApplicationState.ALLOCATING, ApplicationEventType.ALLOCATE,
+      allocateTransition)
+  .addTransition(ApplicationState.EXPIRED_PENDING,
+      ApplicationState.ALLOCATING, ApplicationEventType.RECOVER,
+      allocateTransition)
+   .addTransition(ApplicationState.EXPIRED_PENDING,
+      ApplicationState.FAILED, ApplicationEventType.FAILED_MAX_RETRIES,
+      failedTransition)
+   .addTransition(ApplicationState.EXPIRED_PENDING,
+      ApplicationState.KILLED, ApplicationEventType.KILL, killTransition)
+
+  // Transitions from COMPLETED State
   .addTransition(ApplicationState.COMPLETED, ApplicationState.COMPLETED,
-  ApplicationEventType.FINISH)
-  
-  .addTransition(ApplicationState.COMPLETED, ApplicationState.COMPLETED,
-   ApplicationEventType.KILL)
-   
-  .addTransition(ApplicationState.COMPLETED, ApplicationState.COMPLETED,
-  ApplicationEventType.RECOVER)
-  
+      EnumSet.of(ApplicationEventType.EXPIRE,
+          ApplicationEventType.FINISH, ApplicationEventType.KILL,
+          ApplicationEventType.RECOVER))
+
+  // Transitions from FAILED State
   .addTransition(ApplicationState.FAILED, ApplicationState.FAILED,
-      ApplicationEventType.RECOVER)
-  .addTransition(ApplicationState.FAILED, ApplicationState.FAILED, 
-     ApplicationEventType.FINISH)
-  
-  .addTransition(ApplicationState.FAILED, ApplicationState.FAILED, ApplicationEventType.KILL)
-  
+      EnumSet.of(ApplicationEventType.RECOVER, 
+           ApplicationEventType.FINISH,
+           ApplicationEventType.KILL))
+
+  // Transitions from KILLED State
   .addTransition(ApplicationState.KILLED, ApplicationState.KILLED, 
-      ApplicationEventType.RECOVER)
-  
-  .addTransition(ApplicationState.KILLED, ApplicationState.KILLED, ApplicationEventType.KILL)
-  
-  .addTransition(ApplicationState.KILLED, ApplicationState.KILLED,
-      ApplicationEventType.FINISH)
+      EnumSet.of(ApplicationEventType.RECOVER,
+           ApplicationEventType.KILL,
+           ApplicationEventType.FINISH))
+
   .installTopology();
 
 
@@ -307,10 +293,10 @@
   
   /* the applicaiton master completed successfully */
   private static class DoneTransition implements 
-    SingleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>> {
+    MultipleArcTransition<ApplicationMasterInfo, ASMEvent<ApplicationEventType>, ApplicationState> {
 
     @Override
-    public void transition(ApplicationMasterInfo masterInfo,
+    public ApplicationState transition(ApplicationMasterInfo masterInfo,
     ASMEvent<ApplicationEventType> event) {
       masterInfo.handler.handle(new ASMEvent<SNEventType>(
         SNEventType.CLEANUP, masterInfo));
@@ -318,6 +304,9 @@
         AMLauncherEventType.CLEANUP, masterInfo));
       masterInfo.handler.handle(new ASMEvent<ApplicationTrackerEventType>(
       ApplicationTrackerEventType.REMOVE, masterInfo));
+
+      ApplicationFinishEvent finishEvent = (ApplicationFinishEvent) event;
+      return finishEvent.getFinalApplicationState();
     }
   }
   
diff --git a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationFinishEvent.java b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationFinishEvent.java
new file mode 100644
index 0000000..7776324
--- /dev/null
+++ b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationFinishEvent.java
@@ -0,0 +1,37 @@
+/**
+* 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;
+  }
+}
\ No newline at end of file
diff --git a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java
index b4e834e..e289cd4 100644
--- a/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java
+++ b/yarn/yarn-server/yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/events/ApplicationMasterEvents.java
@@ -47,21 +47,37 @@
   }
   
   public enum ApplicationEventType {
-    ALLOCATE,
+
+    // Source: ApplicationMasterService -> ASM -> AMTracker-self
     REGISTERED,
-    RELEASED,
-    RECOVER,
-    REMOVE,
     STATUSUPDATE,
-    LAUNCH,
-    LAUNCH_FAILED,
-    LAUNCHED,
-    FAILED,
-    FAILED_MAX_RETRIES,
+    FINISH, // Also by AMLauncher
+
+    // Source: SchedulerNegotiator.
     ALLOCATED,
+    RELEASED,
+
+    // Source: ASM -> AMTracker
+    ALLOCATE, // Also AMTracker->Self
+    FAILED,
+    RECOVER,
+
+    // TODO: Nobody Uses!
+    REMOVE,
     CLEANUP,
-    FINISH, 
+
+    // Source: AMLauncher
+    LAUNCHED,
+    LAUNCH_FAILED,
+
+    // Source: AMTracker: Self-event
+    LAUNCH,
+    FAILED_MAX_RETRIES,
+
+    // Source: AMLivelinessMonitor -> AMTracker
     EXPIRE,
+
+    // Source: ClientRMService -> ASM -> AMTracker
     KILL
   };
 }
diff --git a/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestASMStateMachine.java b/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestASMStateMachine.java
index 241f91b..2e2b7d6 100644
--- a/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestASMStateMachine.java
+++ b/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestASMStateMachine.java
@@ -39,6 +39,7 @@
 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.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationFinishEvent;
 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;
@@ -259,8 +260,8 @@
 
     Assert.assertEquals(ApplicationState.RUNNING, masterInfo.getState());
 
-    handler.handle(
-        new ASMEvent<ApplicationEventType>(ApplicationEventType.FINISH, masterInfo));
+    handler.handle(new ApplicationFinishEvent(masterInfo,
+        ApplicationState.COMPLETED));
     waitForState(ApplicationState.COMPLETED, masterInfo);
     Assert.assertEquals(ApplicationState.COMPLETED, masterInfo.getState());
     /* check if clean up is called for everyone */
diff --git a/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterLauncher.java b/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterLauncher.java
index 835fb60..f9e2bc6 100644
--- a/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterLauncher.java
+++ b/yarn/yarn-server/yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestApplicationMasterLauncher.java
@@ -26,6 +26,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ApplicationState;
 import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
 import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.factories.RecordFactory;
@@ -35,6 +36,7 @@
 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.ASMEvent;
+import org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager.events.ApplicationFinishEvent;
 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.recovery.MemStore;
@@ -93,7 +95,8 @@
     }
     public void run() {
       cleanedUp.incrementAndGet();
-      asmHandle.handle(new ASMEvent<ApplicationEventType>(ApplicationEventType.FINISH, null));
+      asmHandle.handle(new ApplicationFinishEvent(null,
+          ApplicationState.COMPLETED));
     }
   }