diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/CuratorBasedElectorService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/CuratorBasedElectorService.java index 660b118faff..ed5a2eb421d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/CuratorBasedElectorService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/CuratorBasedElectorService.java @@ -63,10 +63,15 @@ protected void serviceInit(Configuration conf) throws Exception { YarnConfiguration.DEFAULT_AUTO_FAILOVER_ZK_BASE_PATH); latchPath = zkBasePath + "/" + clusterId; curator = rm.getCurator(); - initAndStartLeaderLatch(); super.serviceInit(conf); } + @Override + protected void serviceStart() throws Exception{ + initAndStartLeaderLatch(); + super.serviceStart(); + } + private void initAndStartLeaderLatch() throws Exception { leaderLatch = new LeaderLatch(curator, latchPath, rmId); leaderLatch.addListener(this); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestLeaderElectorService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestLeaderElectorService.java index 1a81b640925..b3f3c246ae9 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestLeaderElectorService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestLeaderElectorService.java @@ -101,6 +101,18 @@ public void testRMShutDownCauseFailover() throws Exception { waitFor(rm2, HAServiceState.ACTIVE); } + @Test + public void testStartLeaderLatchAfterTransitionToStandby() throws Exception{ + conf.set(YarnConfiguration.RM_HA_ID, "rm1"); + MockRM rm = new MockRM(conf, true); + rm.init(conf); + // If leaderLatch starts before rm starts, + // wait some time rm will become ACTIVE. + Thread.sleep(2000); + rm.start(); + waitFor(rm, HAServiceState.ACTIVE); + } + // 1. rm1 active // 2. rm2 standby // 3. submit a job to rm1 which triggers state-store failure.