YARN-3857: Memory leak in ResourceManager with SIMPLE mode. Contributed by mujunchao.
This commit is contained in:
parent
fc509f66d8
commit
3a76a010b8
|
@ -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
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue