diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java index 7dbc4cc..a7de396 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java @@ -244,7 +244,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 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java 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 d60e8ad..53f9d3e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/FileSystemRMStateStore.java @@ -368,10 +368,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 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java 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 5a20ff2..6ed628f 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/MemoryRMStateStore.java @@ -169,8 +169,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 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java 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 af28a01..340615a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/NullRMStateStore.java @@ -65,7 +65,7 @@ protected void storeApplicationAttemptStateInternal(ApplicationAttemptId attempt } @Override - protected void removeApplicationStateInternal(ApplicationState appState) + protected void removeApplicationStateInternal(ApplicationId appId) throws Exception { // Do nothing } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java 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 dcfdad3..3bd535d 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java @@ -521,20 +521,8 @@ protected abstract void removeRMDTMasterKeyState(DelegationKey delegationKey) * 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)); } /** @@ -543,7 +531,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-986 @@ -657,12 +645,11 @@ protected void handleStoreEvent(RMStateStoreEvent event) { notifyStoreOperationFailed(e); } } else if (event.getType().equals(RMStateStoreEventType.REMOVE_APP)) { - ApplicationState appState = - ((RMStateStoreRemoveAppEvent) event).getAppState(); - ApplicationId appId = appState.getAppId(); + ApplicationId appId = + ((RMStateStoreRemoveAppEvent) event).getAppId(); LOG.info("Removing info for app: " + appId); try { - removeApplicationStateInternal(appState); + removeApplicationStateInternal(appId); } catch (Exception e) { LOG.error("Error removing app: " + appId, e); notifyStoreOperationFailed(e); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRemoveAppEvent.java 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 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreRemoveAppEvent.java +++ 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 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java 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 b8b3d1e..d253186 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/ZKRMStateStore.java @@ -606,14 +606,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 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java index 0a37382..2af2396 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java @@ -248,7 +248,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 @@ -274,7 +274,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 @@ -332,7 +332,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 @@ -374,7 +374,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 @@ -401,7 +401,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()); } @@ -428,7 +428,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 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java 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 30cdbc1..e8fbea5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java +++ 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; @@ -221,24 +222,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); @@ -290,6 +281,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, @@ -476,7 +471,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)) {