YARN-3857: Memory leak in ResourceManager with SIMPLE mode. Contributed by mujunchao.

(cherry picked from commit 3a76a010b8)
This commit is contained in:
Zhihai Xu 2015-08-18 10:36:40 -07:00
parent 38b344adfa
commit 8f2eb99d71
4 changed files with 48 additions and 4 deletions

View File

@ -772,7 +772,10 @@ Release 2.7.2 - UNRELEASED
YARN-3999. RM hangs on draing events. (Jian He via xgong) YARN-3999. RM hangs on draing events. (Jian He via xgong)
Release 2.7.1 - 2015-07-06 YARN-3857: Memory leak in ResourceManager with SIMPLE mode.
(mujunchao via zxu)
Release 2.7.1 - 2015-07-06
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -1309,9 +1309,11 @@ public class RMAppAttemptImpl implements RMAppAttempt, Recoverable {
// register the ClientTokenMasterKey after it is saved in the store, // register the ClientTokenMasterKey after it is saved in the store,
// otherwise client may hold an invalid ClientToken after RM restarts. // otherwise client may hold an invalid ClientToken after RM restarts.
appAttempt.rmContext.getClientToAMTokenSecretManager() if (UserGroupInformation.isSecurityEnabled()) {
.registerApplication(appAttempt.getAppAttemptId(), appAttempt.rmContext.getClientToAMTokenSecretManager()
appAttempt.getClientTokenMasterKey()); .registerApplication(appAttempt.getAppAttemptId(),
appAttempt.getClientTokenMasterKey());
}
} }
} }

View File

@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
import org.apache.hadoop.yarn.security.client.BaseClientToAMTokenSecretManager; import org.apache.hadoop.yarn.security.client.BaseClientToAMTokenSecretManager;
@ -61,4 +62,10 @@ public class ClientToAMTokenSecretManagerInRM extends
ApplicationAttemptId applicationAttemptID) { ApplicationAttemptId applicationAttemptID) {
return this.masterKeys.get(applicationAttemptID); return this.masterKeys.get(applicationAttemptID);
} }
@VisibleForTesting
public synchronized boolean hasMasterKey(
ApplicationAttemptId applicationAttemptID) {
return this.masterKeys.containsKey(applicationAttemptID);
}
} }

View File

@ -1393,6 +1393,38 @@ public class TestRMAppAttemptTransitions {
Assert.assertNull(token); Assert.assertNull(token);
} }
// this is to test master key is saved in the secret manager only after
// attempt is launched and in secure-mode
@Test
public void testApplicationAttemptMasterKey() throws Exception {
Container amContainer = allocateApplicationAttempt();
ApplicationAttemptId appid = applicationAttempt.getAppAttemptId();
boolean isMasterKeyExisted = false;
// before attempt is launched, can not get MasterKey
isMasterKeyExisted = clientToAMTokenManager.hasMasterKey(appid);
Assert.assertFalse(isMasterKeyExisted);
launchApplicationAttempt(amContainer);
// after attempt is launched and in secure mode, can get MasterKey
isMasterKeyExisted = clientToAMTokenManager.hasMasterKey(appid);
if (isSecurityEnabled) {
Assert.assertTrue(isMasterKeyExisted);
Assert.assertNotNull(clientToAMTokenManager.getMasterKey(appid));
} else {
Assert.assertFalse(isMasterKeyExisted);
}
applicationAttempt.handle(new RMAppAttemptEvent(applicationAttempt
.getAppAttemptId(), RMAppAttemptEventType.KILL));
assertEquals(YarnApplicationAttemptState.LAUNCHED,
applicationAttempt.createApplicationAttemptState());
sendAttemptUpdateSavedEvent(applicationAttempt);
// after attempt is killed, can not get MasterKey
isMasterKeyExisted = clientToAMTokenManager.hasMasterKey(appid);
Assert.assertFalse(isMasterKeyExisted);
}
@Test @Test
public void testFailedToFailed() { public void testFailedToFailed() {
// create a failed attempt. // create a failed attempt.