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

This commit is contained in:
Zhihai Xu 2015-08-18 10:36:40 -07:00
parent fc509f66d8
commit 3a76a010b8
4 changed files with 48 additions and 4 deletions

View File

@ -827,7 +827,10 @@ Release 2.7.2 - UNRELEASED
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

View File

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

View File

@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.Map;
import javax.crypto.SecretKey;
import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
import org.apache.hadoop.yarn.security.client.BaseClientToAMTokenSecretManager;
@ -61,4 +62,10 @@ public class ClientToAMTokenSecretManagerInRM extends
ApplicationAttemptId 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);
}
// 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
public void testFailedToFailed() {
// create a failed attempt.