YARN-8409. Fixed NPE in ActiveStandbyElectorBasedElectorService.

Contributed by Chandni Singh
This commit is contained in:
Eric Yang 2018-06-28 12:39:49 -04:00
parent d3fa83a44b
commit 384764cdea
3 changed files with 27 additions and 2 deletions

View File

@ -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 &&

View File

@ -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;

View File

@ -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;