diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMFailover.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMFailover.java index 963d01b4c90ff..29e7ae4c73f88 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMFailover.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/TestRMFailover.java @@ -19,6 +19,7 @@ package org.apache.hadoop.yarn.client; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertNull; @@ -459,4 +460,29 @@ public void testUncaughtExceptionHandlerWithoutHA() verify(spyRTEHandler).uncaughtException(testThread, rte); } + + @Test + public void testTransitionedToStandbyWhenAutoFailover() + throws YarnException, InterruptedException, IOException { + conf.set(YarnConfiguration.RM_CLUSTER_ID, "yarn-test-cluster"); + conf.set(YarnConfiguration.RM_ZK_ADDRESS, hostPort); + conf.setInt(YarnConfiguration.RM_ZK_TIMEOUT_MS, 2000); + + cluster.init(conf); + cluster.start(); + + int activeRMIndex = cluster.getActiveRMIndex(); + assertNotEquals(-1, activeRMIndex, "RM never turned active"); + verifyConnections(); + + HAServiceProtocol.StateChangeRequestInfo requestInfo = new HAServiceProtocol.StateChangeRequestInfo( + HAServiceProtocol.RequestSource.REQUEST_BY_USER_FORCED); + // transit the active RM to standby. + getAdminService(activeRMIndex).transitionToStandby(requestInfo); + verifyRMTransitionToStandby(cluster.getResourceManager(activeRMIndex)); + // the standby RM transition to active. + int newActiveRMIndex = (activeRMIndex + 1) % 2; + assertEquals(newActiveRMIndex, cluster.getActiveRMIndex(), "Failover failed"); + verifyConnections(); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java index b35f8cb295cae..ad3d9ae525d70 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java @@ -1586,6 +1586,8 @@ synchronized void transitionToStandby(boolean initialize) if (state == HAServiceProtocol.HAServiceState.ACTIVE) { stopActiveServices(); reinitialize(initialize); + EmbeddedElector elector = rmContext.getLeaderElectorService(); + if (elector != null) elector.rejoinElection(); } LOG.info("Transitioned to standby state"); }