diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java index 2d5c6a3..cf10be4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java @@ -418,7 +418,8 @@ RMAppAttemptEventType.CONTAINER_ALLOCATED, RMAppAttemptEventType.ATTEMPT_NEW_SAVED, RMAppAttemptEventType.KILL, - RMAppAttemptEventType.FAIL)) + RMAppAttemptEventType.FAIL, + RMAppAttemptEventType.ATTEMPT_ADDED)) // Transitions from FAILED State // For work-preserving AM restart, failed attempt are still capturing @@ -909,7 +910,7 @@ public void handle(RMAppAttemptEvent event) { } catch (InvalidStateTransitionException e) { LOG.error("App attempt: " + appAttemptID + " can't handle this event at current state", e); - /* TODO fail the application on the failed transition */ + onInvalidTranstion(event.getType(), oldState); } // Log at INFO if we're not recovering or not in a terminal state. @@ -2240,4 +2241,8 @@ public void setRecoveredFinalState(RMAppAttemptState finalState) { return Collections.EMPTY_SET; } + protected void onInvalidTranstion(RMAppAttemptEventType rmAppAttemptEventType, + RMAppAttemptState state){ + /* TODO fail the application on the failed transition */ + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java index 9dd5703..b1c62e3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java @@ -167,6 +167,27 @@ private boolean transferStateFromPreviousAttempt = false; private EventHandler rmnodeEventHandler; + private class RMAppAttemptImplForTest extends RMAppAttemptImpl { + + public RMAppAttemptImplForTest( + ApplicationAttemptId appAttemptId, + RMContext rmContext, YarnScheduler scheduler, + ApplicationMasterService masterService, + ApplicationSubmissionContext submissionContext, Configuration conf, + List amReqs, RMApp rmApp) { + super(appAttemptId, rmContext, scheduler, masterService, + submissionContext, conf, amReqs, rmApp); + } + + @Override + protected void onInvalidTranstion( + RMAppAttemptEventType rmAppAttemptEventType, + RMAppAttemptState state) { + Assert.assertTrue("RMAppAttemptImpl can't handle " + + rmAppAttemptEventType + " at state " + state, false); + } + } + private final class TestApplicationAttemptEventDispatcher implements EventHandler { @@ -323,7 +344,7 @@ public void setUp() throws Exception { application = mock(RMAppImpl.class); applicationAttempt = - new RMAppAttemptImpl(applicationAttemptId, spyRMContext, scheduler, + new RMAppAttemptImplForTest(applicationAttemptId, spyRMContext, scheduler, masterService, submissionContext, new Configuration(), Collections.singletonList(BuilderUtils.newResourceRequest( RMAppAttemptImpl.AM_CONTAINER_PRIORITY, ResourceRequest.ANY, @@ -974,6 +995,24 @@ public void testLaunchedAtFinalSaving() { applicationAttempt.getAppAttemptState()); } + @Test(timeout = 10000) + public void testAttemptAddedAtFinalSaving() { + submitApplicationAttempt(); + + // SUBNITED->FINAL_SAVING + applicationAttempt.handle(new RMAppAttemptEvent(applicationAttempt + .getAppAttemptId(), RMAppAttemptEventType.KILL)); + assertEquals(RMAppAttemptState.FINAL_SAVING, + applicationAttempt.getAppAttemptState()); + + // verify for both launched and launch_failed transitions in final_saving + applicationAttempt.handle(new RMAppAttemptEvent(applicationAttempt + .getAppAttemptId(), RMAppAttemptEventType.ATTEMPT_ADDED)); + + assertEquals(RMAppAttemptState.FINAL_SAVING, + applicationAttempt.getAppAttemptState()); + } + @Test public void testAMCrashAtAllocated() { Container amContainer = allocateApplicationAttempt();