diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java index 8dfc13e8c10..b5c3925c3e6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java @@ -694,7 +694,11 @@ public class AdminService extends CompositeService implements return conf; } - private void refreshAll() throws ServiceFailedException { + /* + * Visibility could be private for test its made as default + */ + @VisibleForTesting + void refreshAll() throws ServiceFailedException { try { checkAcls("refreshAll"); refreshQueues(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java index 0c254206be5..97817819701 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java @@ -35,6 +35,7 @@ import org.apache.hadoop.ha.HAServiceProtocol; import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState; import org.apache.hadoop.ha.HAServiceProtocol.StateChangeRequestInfo; import org.apache.hadoop.ha.HealthCheckFailedException; +import org.apache.hadoop.ha.ServiceFailedException; import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; import org.apache.hadoop.net.NetUtils; import org.apache.hadoop.security.AccessControlException; @@ -54,7 +55,6 @@ import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.junit.Assert; @@ -585,19 +585,28 @@ public class TestRMHA { assertEquals(0, rm.getRMContext().getRMApps().size()); } - @Test(timeout = 90000) + @Test(timeout = 9000000) public void testTransitionedToActiveRefreshFail() throws Exception { configuration.setBoolean(YarnConfiguration.AUTO_FAILOVER_ENABLED, false); - YarnConfiguration conf = new YarnConfiguration(configuration); - configuration = new CapacitySchedulerConfiguration(conf); rm = new MockRM(configuration) { @Override protected AdminService createAdminService() { return new AdminService(this, getRMContext()) { + int counter = 0; @Override protected void setConfig(Configuration conf) { super.setConfig(configuration); } + + @Override + protected void refreshAll() throws ServiceFailedException { + if (counter == 0) { + counter++; + throw new ServiceFailedException("Simulate RefreshFail"); + } else { + super.refreshAll(); + } + } }; } @@ -612,23 +621,26 @@ public class TestRMHA { final StateChangeRequestInfo requestInfo = new StateChangeRequestInfo( HAServiceProtocol.RequestSource.REQUEST_BY_USER); - - configuration.set("yarn.scheduler.capacity.root.default.capacity", "100"); - rm.adminService.transitionToStandby(requestInfo); - assertEquals(HAServiceState.STANDBY, rm.getRMContext().getHAServiceState()); - configuration.set("yarn.scheduler.capacity.root.default.capacity", "200"); - try { - rm.adminService.transitionToActive(requestInfo); - } catch (Exception e) { - assertTrue("Error on refreshAll during transistion to Active".contains(e - .getMessage())); - } FailFastDispatcher dispatcher = ((FailFastDispatcher) rm.rmContext.getDispatcher()); + // Verify transistion to transitionToStandby + rm.adminService.transitionToStandby(requestInfo); + assertEquals("Fatal Event should be 0", 0, dispatcher.getEventCount()); + assertEquals("HA state should be in standBy State", HAServiceState.STANDBY, + rm.getRMContext().getHAServiceState()); + try { + // Verify refreshAll call failure and check fail Event is dispatched + rm.adminService.transitionToActive(requestInfo); + Assert.fail("Transistion to Active should have failed for refreshAll()"); + } catch (Exception e) { + assertTrue("Service fail Exception expected", + e instanceof ServiceFailedException); + } + // Since refreshAll failed we are expecting fatal event to be send + // Then fatal event is send RM will shutdown dispatcher.await(); - assertEquals(1, dispatcher.getEventCount()); - // Making correct conf and check the state - configuration.set("yarn.scheduler.capacity.root.default.capacity", "100"); + assertEquals("Fatal Event to be received", 1, dispatcher.getEventCount()); + // Check of refreshAll success HA can be active rm.adminService.transitionToActive(requestInfo); assertEquals(HAServiceState.ACTIVE, rm.getRMContext().getHAServiceState()); rm.adminService.transitionToStandby(requestInfo);