|
@@ -70,6 +70,7 @@ import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.Re
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredContainerState;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredContainerStatus;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredContainerTokensState;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.recovery.NMStateStoreService.RecoveredContainerType;
|
|
|
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.RecoveredLogDeleterState;
|
|
@@ -947,6 +948,74 @@ public class TestNMLeveldbStateStoreService {
|
|
|
store.close();
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void testUnexpectedKeyDoesntThrowException() throws IOException {
|
|
|
+ // test empty when no state
|
|
|
+ List<RecoveredContainerState> recoveredContainers = stateStore
|
|
|
+ .loadContainersState();
|
|
|
+ assertTrue(recoveredContainers.isEmpty());
|
|
|
+
|
|
|
+ // create a container request
|
|
|
+ ApplicationId appId = ApplicationId.newInstance(1234, 3);
|
|
|
+ ApplicationAttemptId appAttemptId = ApplicationAttemptId.newInstance(appId,
|
|
|
+ 4);
|
|
|
+ ContainerId containerId = ContainerId.newContainerId(appAttemptId, 5);
|
|
|
+ LocalResource lrsrc = LocalResource.newInstance(
|
|
|
+ URL.newInstance("hdfs", "somehost", 12345, "/some/path/to/rsrc"),
|
|
|
+ LocalResourceType.FILE, LocalResourceVisibility.APPLICATION, 123L,
|
|
|
+ 1234567890L);
|
|
|
+ Map<String, LocalResource> localResources =
|
|
|
+ new HashMap<String, LocalResource>();
|
|
|
+ localResources.put("rsrc", lrsrc);
|
|
|
+ Map<String, String> env = new HashMap<String, String>();
|
|
|
+ env.put("somevar", "someval");
|
|
|
+ List<String> containerCmds = new ArrayList<String>();
|
|
|
+ containerCmds.add("somecmd");
|
|
|
+ containerCmds.add("somearg");
|
|
|
+ Map<String, ByteBuffer> serviceData = new HashMap<String, ByteBuffer>();
|
|
|
+ serviceData.put("someservice",
|
|
|
+ ByteBuffer.wrap(new byte[] { 0x1, 0x2, 0x3 }));
|
|
|
+ ByteBuffer containerTokens = ByteBuffer
|
|
|
+ .wrap(new byte[] { 0x7, 0x8, 0x9, 0xa });
|
|
|
+ Map<ApplicationAccessType, String> acls =
|
|
|
+ new HashMap<ApplicationAccessType, String>();
|
|
|
+ acls.put(ApplicationAccessType.VIEW_APP, "viewuser");
|
|
|
+ acls.put(ApplicationAccessType.MODIFY_APP, "moduser");
|
|
|
+ ContainerLaunchContext clc = ContainerLaunchContext.newInstance(
|
|
|
+ localResources, env, containerCmds,
|
|
|
+ serviceData, containerTokens, acls);
|
|
|
+ Resource containerRsrc = Resource.newInstance(1357, 3);
|
|
|
+ ContainerTokenIdentifier containerTokenId = new ContainerTokenIdentifier(
|
|
|
+ containerId, "host", "user", containerRsrc, 9876543210L, 42, 2468,
|
|
|
+ Priority.newInstance(7), 13579);
|
|
|
+ Token containerToken = Token.newInstance(containerTokenId.getBytes(),
|
|
|
+ ContainerTokenIdentifier.KIND.toString(), "password".getBytes(),
|
|
|
+ "tokenservice");
|
|
|
+ StartContainerRequest containerReq = StartContainerRequest.newInstance(clc,
|
|
|
+ containerToken);
|
|
|
+
|
|
|
+ stateStore.storeContainer(containerId, 0, containerReq);
|
|
|
+
|
|
|
+ // add a invalid key
|
|
|
+ byte[] invalidKey = ("ContainerManager/containers/"
|
|
|
+ + containerId.toString() + "/invalidKey1234").getBytes();
|
|
|
+ stateStore.getDB().put(invalidKey, new byte[1]);
|
|
|
+ restartStateStore();
|
|
|
+ recoveredContainers = stateStore.loadContainersState();
|
|
|
+ assertEquals(1, recoveredContainers.size());
|
|
|
+ RecoveredContainerState rcs = recoveredContainers.get(0);
|
|
|
+ assertEquals(RecoveredContainerStatus.REQUESTED, rcs.getStatus());
|
|
|
+ assertEquals(ContainerExitStatus.INVALID, rcs.getExitCode());
|
|
|
+ assertEquals(false, rcs.getKilled());
|
|
|
+ assertEquals(containerReq, rcs.getStartRequest());
|
|
|
+ assertTrue(rcs.getDiagnostics().isEmpty());
|
|
|
+ assertEquals(RecoveredContainerType.KILL, rcs.getRecoveryType());
|
|
|
+ // assert unknown keys are cleaned up finally
|
|
|
+ assertNotNull(stateStore.getDB().get(invalidKey));
|
|
|
+ stateStore.removeContainer(containerId);
|
|
|
+ assertNull(stateStore.getDB().get(invalidKey));
|
|
|
+ }
|
|
|
+
|
|
|
private static class NMTokenSecretManagerForTest extends
|
|
|
BaseNMTokenSecretManager {
|
|
|
public MasterKey generateKey() {
|