From 6fc68a379b15a5f5cdac8e2a2e0d39aa6c2842cc Mon Sep 17 00:00:00 2001 From: Jason Lowe Date: Wed, 3 Aug 2016 20:17:30 +0000 Subject: [PATCH] HADOOP-10980. TestActiveStandbyElector fails occasionally in trunk. Contributed by Eric Badger (cherry picked from commit c82745432a962c817a8a7db92bb830fb6af01e33) --- .../hadoop/ha/ActiveStandbyElector.java | 19 +++++++++++++++---- .../hadoop/ha/TestActiveStandbyElector.java | 12 ++++++++++-- 2 files changed, 25 insertions(+), 6 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 cb2e08143e3..9a90ccfdadb 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 @@ -667,13 +667,13 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { /** * Get a new zookeeper client instance. protected so that test class can - * inherit and pass in a mock object for zookeeper + * inherit and mock out the zookeeper instance * * @return new zookeeper client instance * @throws IOException * @throws KeeperException zookeeper connectionloss exception */ - protected synchronized ZooKeeper getNewZooKeeper() throws IOException, + protected synchronized ZooKeeper connectToZooKeeper() throws IOException, KeeperException { // Unfortunately, the ZooKeeper constructor connects to ZooKeeper and @@ -682,7 +682,7 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { // we construct the watcher first, and have it block any events it receives // before we can set its ZooKeeper reference. watcher = new WatcherWithClientRef(); - ZooKeeper zk = new ZooKeeper(zkHostPort, zkSessionTimeout, watcher); + ZooKeeper zk = createZooKeeper(); watcher.setZooKeeperRef(zk); // Wait for the asynchronous success/failure. This may throw an exception @@ -695,6 +695,17 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { return zk; } + /** + * Get a new zookeeper client instance. protected so that test class can + * inherit and pass in a mock object for zookeeper + * + * @return new zookeeper client instance + * @throws IOException + */ + protected ZooKeeper createZooKeeper() throws IOException { + return new ZooKeeper(zkHostPort, zkSessionTimeout, watcher); + } + private void fatalError(String errorMessage) { LOG.fatal(errorMessage); reset(); @@ -830,7 +841,7 @@ public class ActiveStandbyElector implements StatCallback, StringCallback { zkClient = null; watcher = null; } - zkClient = getNewZooKeeper(); + zkClient = connectToZooKeeper(); if (LOG.isDebugEnabled()) { LOG.debug("Created new connection for " + this); } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java index 83a3a4f8c85..8c6f7a3300a 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ha/TestActiveStandbyElector.java @@ -66,7 +66,7 @@ public class TestActiveStandbyElector { } @Override - public ZooKeeper getNewZooKeeper() { + public ZooKeeper connectToZooKeeper() { ++count; return mockZK; } @@ -749,7 +749,15 @@ public class TestActiveStandbyElector { try { new ActiveStandbyElector("127.0.0.1", 2000, ZK_PARENT_NAME, Ids.OPEN_ACL_UNSAFE, Collections. emptyList(), mockApp, - CommonConfigurationKeys.HA_FC_ELECTOR_ZK_OP_RETRIES_DEFAULT); + CommonConfigurationKeys.HA_FC_ELECTOR_ZK_OP_RETRIES_DEFAULT) { + + @Override + protected ZooKeeper createZooKeeper() throws IOException { + return Mockito.mock(ZooKeeper.class); + } + }; + + Assert.fail("Did not throw zookeeper connection loss exceptions!"); } catch (KeeperException ke) { GenericTestUtils.assertExceptionContains( "ConnectionLoss", ke);