From 384764cdeac6490bc47fa0eb7b936baa4c0d3230 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Thu, 28 Jun 2018 12:39:49 -0400 Subject: [PATCH] YARN-8409. Fixed NPE in ActiveStandbyElectorBasedElectorService. Contributed by Chandni Singh --- .../hadoop/ha/ActiveStandbyElector.java | 5 ++++- .../hadoop/ha/ZKFailoverController.java | 2 +- .../TestRMEmbeddedElector.java | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java index a23fb71e41f..d099ca71ac7 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ActiveStandbyElector.java @@ -329,9 +329,12 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { * This recursively creates the znode as well as all of its parents. */ public synchronized void ensureParentZNode() - throws IOException, InterruptedException { + throws IOException, InterruptedException, KeeperException { Preconditions.checkState(!wantToBeInElection, "ensureParentZNode() may not be called while in the election"); + if (zkClient == null) { + createConnection(); + } String pathParts[] = znodeWorkingDir.split("/"); Preconditions.checkArgument(pathParts.length >= 1 && diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ZKFailoverController.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ZKFailoverController.java index 9295288fb75..f66e3c97490 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ZKFailoverController.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ha/ZKFailoverController.java @@ -269,7 +269,7 @@ public abstract class ZKFailoverController { } private int formatZK(boolean force, boolean interactive) - throws IOException, InterruptedException { + throws IOException, InterruptedException, KeeperException { if (elector.parentZNodeExists()) { if (!force && (!interactive || !confirmFormat())) { return ERR_CODE_FORMAT_DENIED; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMEmbeddedElector.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMEmbeddedElector.java index 9d38149937f..8c038618c10 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMEmbeddedElector.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMEmbeddedElector.java @@ -22,8 +22,10 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ha.ClientBaseWithFixes; import org.apache.hadoop.ha.ServiceFailedException; +import org.apache.hadoop.service.ServiceStateException; import org.apache.hadoop.test.GenericTestUtils; import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -304,6 +306,26 @@ public class TestRMEmbeddedElector extends ClientBaseWithFixes { verify(as, times(1)).transitionToStandby(any()); } + /** + * Test that active elector service triggers a fatal RM Event when connection + * to ZK fails. YARN-8409 + */ + @Test + public void testFailureToConnectToZookeeper() throws Exception { + stopServer(); + Configuration myConf = new Configuration(conf); + ResourceManager rm = new MockRM(conf); + + ActiveStandbyElectorBasedElectorService ees = + new ActiveStandbyElectorBasedElectorService(rm); + try { + ees.init(myConf); + Assert.fail("expect failure to connect to Zookeeper"); + } catch (ServiceStateException sse) { + Assert.assertTrue(sse.getMessage().contains("ConnectionLoss")); + } + } + private class MockRMWithElector extends MockRM { private long delayMs = 0;