diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java index 51024cf..3f4e35c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java @@ -246,7 +246,7 @@ protected synchronized void checkAppNumCompletedLimit() { + " maxCompletedAppsInStateStore = " + maxCompletedAppsInStateStore + ", removing app " + removeApp.getApplicationId() + " from state store."); - rmContext.getStateStore().removeApplication(removeApp); + rmContext.getStateStore().removeApplication(removeId); completedAppsInStateStore--; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java index d57669c..b7af9b1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java @@ -460,10 +460,9 @@ public synchronized void updateApplicationAttemptStateInternal( } @Override - public synchronized void removeApplicationStateInternal(ApplicationState appState) + public synchronized void removeApplicationStateInternal(ApplicationId appId) throws Exception { - String appId = appState.getAppId().toString(); - Path nodeRemovePath = getAppDir(rmAppRoot, appId); + Path nodeRemovePath = getAppDir(rmAppRoot, appId.toString()); LOG.info("Removing info for app: " + appId + " at: " + nodeRemovePath); deleteFile(nodeRemovePath); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java index f56517c..c4436cb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java @@ -183,8 +183,7 @@ public synchronized void updateApplicationAttemptStateInternal( @Override public synchronized void removeApplicationStateInternal( - ApplicationState appState) throws Exception { - ApplicationId appId = appState.getAppId(); + ApplicationId appId) throws Exception { ApplicationState removed = state.appState.remove(appId); if (removed == null) { throw new YarnRuntimeException("Removing non-exsisting application state"); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java index e910c19..ed30e0d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java @@ -71,7 +71,7 @@ protected void storeApplicationAttemptStateInternal(ApplicationAttemptId attempt } @Override - protected void removeApplicationStateInternal(ApplicationState appState) + protected void removeApplicationStateInternal(ApplicationId appId) throws Exception { // Do nothing } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java index 714a108..ca36b22 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java @@ -175,12 +175,10 @@ public void transition(RMStateStore store, RMStateStoreEvent event) { LOG.error("Illegal event type: " + event.getClass()); return; } - ApplicationState appState = ((RMStateStoreRemoveAppEvent) event) - .getAppState(); - ApplicationId appId = appState.getAppId(); + ApplicationId appId = ((RMStateStoreRemoveAppEvent) event).getAppId(); LOG.info("Removing info for app: " + appId); try { - store.removeApplicationStateInternal(appState); + store.removeApplicationStateInternal(appId); } catch (Exception e) { LOG.error("Error removing app: " + appId, e); store.notifyStoreOperationFailed(e); @@ -737,20 +735,8 @@ public abstract void storeOrUpdateAMRMTokenSecretManagerState( * There is no notification of completion for this operation. */ @SuppressWarnings("unchecked") - public synchronized void removeApplication(RMApp app) { - ApplicationState appState = new ApplicationState( - app.getSubmitTime(), app.getStartTime(), - app.getApplicationSubmissionContext(), app.getUser()); - for(RMAppAttempt appAttempt : app.getAppAttempts().values()) { - Credentials credentials = getCredentialsFromAppAttempt(appAttempt); - ApplicationAttemptState attemptState = - new ApplicationAttemptState(appAttempt.getAppAttemptId(), - appAttempt.getMasterContainer(), credentials, - appAttempt.getStartTime()); - appState.attempts.put(attemptState.getAttemptId(), attemptState); - } - - dispatcher.getEventHandler().handle(new RMStateStoreRemoveAppEvent(appState)); + public synchronized void removeApplication(ApplicationId appId) { + dispatcher.getEventHandler().handle(new RMStateStoreRemoveAppEvent(appId)); } /** @@ -759,7 +745,7 @@ public synchronized void removeApplication(RMApp app) { * application and its attempts */ protected abstract void removeApplicationStateInternal( - ApplicationState appState) throws Exception; + ApplicationId applicationId) throws Exception; // TODO: This should eventually become cluster-Id + "AM_RM_TOKEN_SERVICE". See // YARN-1779 diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRemoveAppEvent.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRemoveAppEvent.java index 402feb9..3de5ab2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRemoveAppEvent.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRemoveAppEvent.java @@ -18,17 +18,18 @@ package org.apache.hadoop.yarn.server.resourcemanager.recovery; +import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore.ApplicationState; public class RMStateStoreRemoveAppEvent extends RMStateStoreEvent { - ApplicationState appState; + ApplicationId appId; - RMStateStoreRemoveAppEvent(ApplicationState appState) { + RMStateStoreRemoveAppEvent(ApplicationId appId) { super(RMStateStoreEventType.REMOVE_APP); - this.appState = appState; + this.appId = appId; } - public ApplicationState getAppState() { - return appState; + public ApplicationId getAppId() { + return appId; } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java index 1544dcc..9f84f91 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java @@ -690,14 +690,15 @@ public synchronized void updateApplicationAttemptStateInternal( } @Override - public synchronized void removeApplicationStateInternal(ApplicationState appState) + public synchronized void removeApplicationStateInternal(ApplicationId appId) throws Exception { - String appId = appState.getAppId().toString(); - String appIdRemovePath = getNodePath(rmAppRoot, appId); + String appIdStr = appId.toString(); + String appIdRemovePath = getNodePath(rmAppRoot, appIdStr); ArrayList opList = new ArrayList(); - for (ApplicationAttemptId attemptId : appState.attempts.keySet()) { - String attemptRemovePath = getNodePath(appIdRemovePath, attemptId.toString()); + List attemptIds = getChildrenWithRetries(appIdRemovePath, false); + for (String attemptId : attemptIds) { + String attemptRemovePath = getNodePath(appIdRemovePath, attemptId); opList.add(Op.delete(attemptRemovePath, -1)); } opList.add(Op.delete(appIdRemovePath, -1)); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java index d720eb6..f6f7677 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java @@ -254,7 +254,7 @@ public void testRMAppRetireNone() throws Exception { Assert.assertEquals("Number of completed apps incorrect after check", 10, appMonitor.getCompletedAppsListSize()); verify(rmContext.getStateStore(), never()).removeApplication( - isA(RMApp.class)); + isA(ApplicationId.class)); } @Test @@ -280,7 +280,7 @@ public void testRMAppRetireSome() throws Exception { Assert.assertEquals("Number of completed apps incorrect after check", 3, appMonitor.getCompletedAppsListSize()); verify(rmContext.getStateStore(), times(7)).removeApplication( - isA(RMApp.class)); + isA(ApplicationId.class)); } @Test @@ -338,7 +338,7 @@ public void testRMAppRetireSomeDifferentStates() throws Exception { appMonitor.getCompletedAppsListSize()); // 6 applications in final state, 4 of them are removed verify(rmContext.getStateStore(), times(4)).removeApplication( - isA(RMApp.class)); + isA(ApplicationId.class)); } @Test @@ -380,7 +380,7 @@ public void testRMAppRetireZeroSetting() throws Exception { Assert.assertEquals("Number of completed apps incorrect after check", 0, appMonitor.getCompletedAppsListSize()); verify(rmContext.getStateStore(), times(10)).removeApplication( - isA(RMApp.class)); + isA(ApplicationId.class)); } @Test @@ -407,7 +407,7 @@ public void testStateStoreAppLimitLessThanMemoryAppLimit() { int numRemoveAppsFromStateStore = 10 - maxAppsInStateStore; verify(rmContext.getStateStore(), times(numRemoveAppsFromStateStore)) - .removeApplication(isA(RMApp.class)); + .removeApplication(isA(ApplicationId.class)); Assert.assertEquals(maxAppsInStateStore, appMonitor.getCompletedAppsInStateStore()); } @@ -434,7 +434,7 @@ public void testStateStoreAppLimitLargerThanMemoryAppLimit() { Assert.assertEquals("Number of completed apps incorrect after check", maxAppsInMemory, appMonitor.getCompletedAppsListSize()); verify(rmContext.getStateStore(), times(numRemoveApps)).removeApplication( - isA(RMApp.class)); + isA(ApplicationId.class)); Assert.assertEquals(maxAppsInMemory, appMonitor.getCompletedAppsInStateStore()); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java index 620ba9f..bf86f1e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; @@ -224,24 +225,14 @@ void testRMAppStateStore(RMStateStoreHelper stateStoreHelper) "container_1352994193343_0002_01_000001", null, null, dispatcher); RMApp mockRemovedApp = mock(RMApp.class); - HashMap attempts = - new HashMap(); - ApplicationSubmissionContext context = - new ApplicationSubmissionContextPBImpl(); - context.setApplicationId(appIdRemoved); - when(mockRemovedApp.getSubmitTime()).thenReturn(submitTime); - when(mockRemovedApp.getApplicationSubmissionContext()).thenReturn(context); - when(mockRemovedApp.getAppAttempts()).thenReturn(attempts); - RMAppAttempt mockRemovedAttempt = mock(RMAppAttempt.class); - when(mockRemovedAttempt.getAppAttemptId()).thenReturn(attemptIdRemoved); - attempts.put(attemptIdRemoved, mockRemovedAttempt); - store.removeApplication(mockRemovedApp); + when(mockRemovedApp.getApplicationId()).thenReturn(appIdRemoved); + store.removeApplication(mockRemovedApp.getApplicationId()); // remove application directory recursively. storeApp(store, appIdRemoved, submitTime, startTime); storeAttempt(store, attemptIdRemoved, "container_1352994193343_0002_01_000001", null, null, dispatcher); - store.removeApplication(mockRemovedApp); + store.removeApplication(mockRemovedApp.getApplicationId()); // let things settle down Thread.sleep(1000); @@ -289,6 +280,10 @@ void testRMAppStateStore(RMStateStoreHelper stateStoreHelper) attemptState.getAppAttemptCredentials() .getSecretKey(RMStateStore.AM_CLIENT_TOKEN_MASTER_KEY_NAME)); + // removed application should be null + ApplicationState appStateRemoved = rmAppState.get(appIdRemoved); + assertNull("Removed appState should be null", appStateRemoved); + //******* update application/attempt state *******// ApplicationState appState2 = new ApplicationState(appState.submitTime, appState.startTime, @@ -512,7 +507,7 @@ public void testAppDeletion(RMStateStoreHelper stateStoreHelper) for (RMApp app : appList) { // remove the app - store.removeApplication(app); + store.removeApplication(app.getApplicationId()); // wait for app to be removed. while (true) { if (!stateStoreHelper.appExists(app)) {