HADOOP-10980. TestActiveStandbyElector fails occasionally in trunk. Contributed by Eric Badger

(cherry picked from commit c82745432a)
This commit is contained in:
Jason Lowe 2016-08-03 20:17:30 +00:00
parent eef24f5d93
commit 6fc68a379b
2 changed files with 25 additions and 6 deletions

View File

@ -667,13 +667,13 @@ public class ActiveStandbyElector implements StatCallback, StringCallback {
/** /**
* Get a new zookeeper client instance. protected so that test class can * 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 * @return new zookeeper client instance
* @throws IOException * @throws IOException
* @throws KeeperException zookeeper connectionloss exception * @throws KeeperException zookeeper connectionloss exception
*/ */
protected synchronized ZooKeeper getNewZooKeeper() throws IOException, protected synchronized ZooKeeper connectToZooKeeper() throws IOException,
KeeperException { KeeperException {
// Unfortunately, the ZooKeeper constructor connects to ZooKeeper and // 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 // we construct the watcher first, and have it block any events it receives
// before we can set its ZooKeeper reference. // before we can set its ZooKeeper reference.
watcher = new WatcherWithClientRef(); watcher = new WatcherWithClientRef();
ZooKeeper zk = new ZooKeeper(zkHostPort, zkSessionTimeout, watcher); ZooKeeper zk = createZooKeeper();
watcher.setZooKeeperRef(zk); watcher.setZooKeeperRef(zk);
// Wait for the asynchronous success/failure. This may throw an exception // Wait for the asynchronous success/failure. This may throw an exception
@ -695,6 +695,17 @@ public class ActiveStandbyElector implements StatCallback, StringCallback {
return zk; 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) { private void fatalError(String errorMessage) {
LOG.fatal(errorMessage); LOG.fatal(errorMessage);
reset(); reset();
@ -830,7 +841,7 @@ public class ActiveStandbyElector implements StatCallback, StringCallback {
zkClient = null; zkClient = null;
watcher = null; watcher = null;
} }
zkClient = getNewZooKeeper(); zkClient = connectToZooKeeper();
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("Created new connection for " + this); LOG.debug("Created new connection for " + this);
} }

View File

@ -66,7 +66,7 @@ public class TestActiveStandbyElector {
} }
@Override @Override
public ZooKeeper getNewZooKeeper() { public ZooKeeper connectToZooKeeper() {
++count; ++count;
return mockZK; return mockZK;
} }
@ -749,7 +749,15 @@ public class TestActiveStandbyElector {
try { try {
new ActiveStandbyElector("127.0.0.1", 2000, ZK_PARENT_NAME, new ActiveStandbyElector("127.0.0.1", 2000, ZK_PARENT_NAME,
Ids.OPEN_ACL_UNSAFE, Collections.<ZKAuthInfo> emptyList(), mockApp, Ids.OPEN_ACL_UNSAFE, Collections.<ZKAuthInfo> 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!"); Assert.fail("Did not throw zookeeper connection loss exceptions!");
} catch (KeeperException ke) { } catch (KeeperException ke) {
GenericTestUtils.assertExceptionContains( "ConnectionLoss", ke); GenericTestUtils.assertExceptionContains( "ConnectionLoss", ke);