|
@@ -27,11 +27,13 @@ import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.util.Map;
|
|
|
|
|
|
+import org.apache.hadoop.conf.Configuration;
|
|
|
import org.apache.hadoop.fs.FileUtil;
|
|
|
import org.apache.hadoop.fs.Path;
|
|
|
import org.apache.hadoop.service.ServiceStateException;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
|
|
+import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
|
import org.apache.hadoop.yarn.api.records.LocalResource;
|
|
|
import org.apache.hadoop.yarn.api.records.LocalResourceType;
|
|
|
import org.apache.hadoop.yarn.api.records.LocalResourceVisibility;
|
|
@@ -42,12 +44,15 @@ import org.apache.hadoop.yarn.proto.YarnServerNodemanagerRecoveryProtos.Deletion
|
|
|
import org.apache.hadoop.yarn.proto.YarnServerNodemanagerRecoveryProtos.LocalizedResourceProto;
|
|
|
import org.apache.hadoop.yarn.server.api.records.MasterKey;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.LocalResourceTrackerState;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredContainerTokensState;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredDeletionServiceState;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredLocalizationState;
|
|
|
-import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredNMTokenState;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredNMTokensState;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredUserResources;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.records.NMDBSchemaVersion;
|
|
|
+import org.apache.hadoop.yarn.server.security.BaseContainerTokenSecretManager;
|
|
|
import org.apache.hadoop.yarn.server.security.BaseNMTokenSecretManager;
|
|
|
+import org.apache.hadoop.yarn.server.utils.BuilderUtils;
|
|
|
import org.apache.hadoop.yarn.util.ConverterUtils;
|
|
|
import org.junit.After;
|
|
|
import org.junit.Assert;
|
|
@@ -502,7 +507,7 @@ public class TestNMLeveldbStateStoreService {
|
|
|
@Test
|
|
|
public void testNMTokenStorage() throws IOException {
|
|
|
// test empty when no state
|
|
|
- RecoveredNMTokenState state = stateStore.loadNMTokenState();
|
|
|
+ RecoveredNMTokensState state = stateStore.loadNMTokensState();
|
|
|
assertNull(state.getCurrentMasterKey());
|
|
|
assertNull(state.getPreviousMasterKey());
|
|
|
assertTrue(state.getApplicationMasterKeys().isEmpty());
|
|
@@ -512,7 +517,7 @@ public class TestNMLeveldbStateStoreService {
|
|
|
MasterKey currentKey = secretMgr.generateKey();
|
|
|
stateStore.storeNMTokenCurrentMasterKey(currentKey);
|
|
|
restartStateStore();
|
|
|
- state = stateStore.loadNMTokenState();
|
|
|
+ state = stateStore.loadNMTokensState();
|
|
|
assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
assertNull(state.getPreviousMasterKey());
|
|
|
assertTrue(state.getApplicationMasterKeys().isEmpty());
|
|
@@ -521,7 +526,7 @@ public class TestNMLeveldbStateStoreService {
|
|
|
MasterKey prevKey = secretMgr.generateKey();
|
|
|
stateStore.storeNMTokenPreviousMasterKey(prevKey);
|
|
|
restartStateStore();
|
|
|
- state = stateStore.loadNMTokenState();
|
|
|
+ state = stateStore.loadNMTokensState();
|
|
|
assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
assertEquals(prevKey, state.getPreviousMasterKey());
|
|
|
assertTrue(state.getApplicationMasterKeys().isEmpty());
|
|
@@ -536,7 +541,7 @@ public class TestNMLeveldbStateStoreService {
|
|
|
MasterKey attemptKey2 = secretMgr.generateKey();
|
|
|
stateStore.storeNMTokenApplicationMasterKey(attempt2, attemptKey2);
|
|
|
restartStateStore();
|
|
|
- state = stateStore.loadNMTokenState();
|
|
|
+ state = stateStore.loadNMTokensState();
|
|
|
assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
assertEquals(prevKey, state.getPreviousMasterKey());
|
|
|
Map<ApplicationAttemptId, MasterKey> loadedAppKeys =
|
|
@@ -558,7 +563,7 @@ public class TestNMLeveldbStateStoreService {
|
|
|
currentKey = secretMgr.generateKey();
|
|
|
stateStore.storeNMTokenCurrentMasterKey(currentKey);
|
|
|
restartStateStore();
|
|
|
- state = stateStore.loadNMTokenState();
|
|
|
+ state = stateStore.loadNMTokensState();
|
|
|
assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
assertEquals(prevKey, state.getPreviousMasterKey());
|
|
|
loadedAppKeys = state.getApplicationMasterKeys();
|
|
@@ -568,10 +573,89 @@ public class TestNMLeveldbStateStoreService {
|
|
|
assertEquals(attemptKey3, loadedAppKeys.get(attempt3));
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testContainerTokenStorage() throws IOException {
|
|
|
+ // test empty when no state
|
|
|
+ RecoveredContainerTokensState state =
|
|
|
+ stateStore.loadContainerTokensState();
|
|
|
+ assertNull(state.getCurrentMasterKey());
|
|
|
+ assertNull(state.getPreviousMasterKey());
|
|
|
+ assertTrue(state.getActiveTokens().isEmpty());
|
|
|
+
|
|
|
+ // store a master key and verify recovered
|
|
|
+ ContainerTokenKeyGeneratorForTest keygen =
|
|
|
+ new ContainerTokenKeyGeneratorForTest(new YarnConfiguration());
|
|
|
+ MasterKey currentKey = keygen.generateKey();
|
|
|
+ stateStore.storeContainerTokenCurrentMasterKey(currentKey);
|
|
|
+ restartStateStore();
|
|
|
+ state = stateStore.loadContainerTokensState();
|
|
|
+ assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
+ assertNull(state.getPreviousMasterKey());
|
|
|
+ assertTrue(state.getActiveTokens().isEmpty());
|
|
|
+
|
|
|
+ // store a previous key and verify recovered
|
|
|
+ MasterKey prevKey = keygen.generateKey();
|
|
|
+ stateStore.storeContainerTokenPreviousMasterKey(prevKey);
|
|
|
+ restartStateStore();
|
|
|
+ state = stateStore.loadContainerTokensState();
|
|
|
+ assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
+ assertEquals(prevKey, state.getPreviousMasterKey());
|
|
|
+ assertTrue(state.getActiveTokens().isEmpty());
|
|
|
+
|
|
|
+ // store a few container tokens and verify recovered
|
|
|
+ ContainerId cid1 = BuilderUtils.newContainerId(1, 1, 1, 1);
|
|
|
+ Long expTime1 = 1234567890L;
|
|
|
+ ContainerId cid2 = BuilderUtils.newContainerId(2, 2, 2, 2);
|
|
|
+ Long expTime2 = 9876543210L;
|
|
|
+ stateStore.storeContainerToken(cid1, expTime1);
|
|
|
+ stateStore.storeContainerToken(cid2, expTime2);
|
|
|
+ restartStateStore();
|
|
|
+ state = stateStore.loadContainerTokensState();
|
|
|
+ assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
+ assertEquals(prevKey, state.getPreviousMasterKey());
|
|
|
+ Map<ContainerId, Long> loadedActiveTokens =
|
|
|
+ state.getActiveTokens();
|
|
|
+ assertEquals(2, loadedActiveTokens.size());
|
|
|
+ assertEquals(expTime1, loadedActiveTokens.get(cid1));
|
|
|
+ assertEquals(expTime2, loadedActiveTokens.get(cid2));
|
|
|
+
|
|
|
+ // add/update/remove tokens and verify recovered
|
|
|
+ ContainerId cid3 = BuilderUtils.newContainerId(3, 3, 3, 3);
|
|
|
+ Long expTime3 = 135798642L;
|
|
|
+ stateStore.storeContainerToken(cid3, expTime3);
|
|
|
+ stateStore.removeContainerToken(cid1);
|
|
|
+ expTime2 += 246897531L;
|
|
|
+ stateStore.storeContainerToken(cid2, expTime2);
|
|
|
+ prevKey = currentKey;
|
|
|
+ stateStore.storeContainerTokenPreviousMasterKey(prevKey);
|
|
|
+ currentKey = keygen.generateKey();
|
|
|
+ stateStore.storeContainerTokenCurrentMasterKey(currentKey);
|
|
|
+ restartStateStore();
|
|
|
+ state = stateStore.loadContainerTokensState();
|
|
|
+ assertEquals(currentKey, state.getCurrentMasterKey());
|
|
|
+ assertEquals(prevKey, state.getPreviousMasterKey());
|
|
|
+ loadedActiveTokens = state.getActiveTokens();
|
|
|
+ assertEquals(2, loadedActiveTokens.size());
|
|
|
+ assertNull(loadedActiveTokens.get(cid1));
|
|
|
+ assertEquals(expTime2, loadedActiveTokens.get(cid2));
|
|
|
+ assertEquals(expTime3, loadedActiveTokens.get(cid3));
|
|
|
+ }
|
|
|
+
|
|
|
private static class NMTokenSecretManagerForTest extends
|
|
|
BaseNMTokenSecretManager {
|
|
|
public MasterKey generateKey() {
|
|
|
return createNewMasterKey().getMasterKey();
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ private static class ContainerTokenKeyGeneratorForTest extends
|
|
|
+ BaseContainerTokenSecretManager {
|
|
|
+ public ContainerTokenKeyGeneratorForTest(Configuration conf) {
|
|
|
+ super(conf);
|
|
|
+ }
|
|
|
+
|
|
|
+ public MasterKey generateKey() {
|
|
|
+ return createNewMasterKey().getMasterKey();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|