|
@@ -39,8 +39,12 @@ import org.apache.hadoop.yarn.api.records.Resource;
|
|
|
import org.apache.hadoop.yarn.api.records.ResourceRequest;
|
|
|
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
|
+import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
|
import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.TestRMRestart.TestSecurityMockRM;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.placement
|
|
|
+ .ApplicationPlacementContext;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.placement.PlacementManager;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore.RMState;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.recovery.records.ApplicationAttemptStateData;
|
|
@@ -105,6 +109,8 @@ import static org.apache.hadoop.yarn.server.resourcemanager.scheduler
|
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp
|
|
|
.RMWebServices.DEFAULT_QUEUE;
|
|
|
import static org.junit.Assert.*;
|
|
|
+import static org.mockito.Matchers.any;
|
|
|
+import static org.mockito.Mockito.doThrow;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
@@ -1554,6 +1560,48 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
|
|
|
|
|
|
}
|
|
|
|
|
|
+ @Test(timeout = 30000)
|
|
|
+ public void testUnknownUserOnRecovery() throws Exception {
|
|
|
+
|
|
|
+ MockRM rm1 = new MockRM(conf);
|
|
|
+ rm1.start();
|
|
|
+ MockMemoryRMStateStore memStore =
|
|
|
+ (MockMemoryRMStateStore) rm1.getRMStateStore();
|
|
|
+ MockNM nm1 =
|
|
|
+ new MockNM("127.0.0.1:1234", 15120, rm1.getResourceTrackerService());
|
|
|
+ nm1.registerNode();
|
|
|
+
|
|
|
+ // create app and launch the UAM
|
|
|
+ RMApp app0 = rm1.submitApp(200, true);
|
|
|
+ MockAM am0 = MockRM.launchUAM(app0, rm1, nm1);
|
|
|
+ am0.registerAppAttempt();
|
|
|
+ rm1.killApp(app0.getApplicationId());
|
|
|
+ PlacementManager placementMgr = mock(PlacementManager.class);
|
|
|
+ doThrow(new YarnException("No groups for user")).when(placementMgr)
|
|
|
+ .placeApplication(any(ApplicationSubmissionContext.class),
|
|
|
+ any(String.class));
|
|
|
+ MockRM rm2 = new MockRM(conf, memStore) {
|
|
|
+ @Override
|
|
|
+ protected RMAppManager createRMAppManager() {
|
|
|
+ return new RMAppManager(this.rmContext, this.scheduler,
|
|
|
+ this.masterService, this.applicationACLsManager, conf) {
|
|
|
+ @Override
|
|
|
+ ApplicationPlacementContext placeApplication(
|
|
|
+ PlacementManager placementManager,
|
|
|
+ ApplicationSubmissionContext context, String user,
|
|
|
+ boolean isRecovery) throws YarnException {
|
|
|
+ return super
|
|
|
+ .placeApplication(placementMgr, context, user, isRecovery);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ rm2.start();
|
|
|
+ RMApp recoveredApp =
|
|
|
+ rm2.getRMContext().getRMApps().get(app0.getApplicationId());
|
|
|
+ Assert.assertEquals(RMAppState.KILLED, recoveredApp.getState());
|
|
|
+ }
|
|
|
+
|
|
|
@Test(timeout = 30000)
|
|
|
public void testDynamicAutoCreatedQueueRecoveryWithDefaultQueue()
|
|
|
throws Exception {
|