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 8fa530746f
commit 3ce3571a34
3 changed files with 28 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. * This recursively creates the znode as well as all of its parents.
*/ */
public synchronized void ensureParentZNode() public synchronized void ensureParentZNode()
throws IOException, InterruptedException { throws IOException, InterruptedException, KeeperException {
Preconditions.checkState(!wantToBeInElection, Preconditions.checkState(!wantToBeInElection,
"ensureParentZNode() may not be called while in the election"); "ensureParentZNode() may not be called while in the election");
if (zkClient == null) {
createConnection();
}
String pathParts[] = znodeWorkingDir.split("/"); String pathParts[] = znodeWorkingDir.split("/");
Preconditions.checkArgument(pathParts.length >= 1 && Preconditions.checkArgument(pathParts.length >= 1 &&

View File

@ -269,7 +269,7 @@ public abstract class ZKFailoverController {
} }
private int formatZK(boolean force, boolean interactive) private int formatZK(boolean force, boolean interactive)
throws IOException, InterruptedException { throws IOException, InterruptedException, KeeperException {
if (elector.parentZNodeExists()) { if (elector.parentZNodeExists()) {
if (!force && (!interactive || !confirmFormat())) { if (!force && (!interactive || !confirmFormat())) {
return ERR_CODE_FORMAT_DENIED; return ERR_CODE_FORMAT_DENIED;

View File

@ -22,7 +22,10 @@ import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ha.ClientBaseWithFixes; import org.apache.hadoop.ha.ClientBaseWithFixes;
import org.apache.hadoop.ha.ServiceFailedException; 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.apache.hadoop.yarn.conf.YarnConfiguration;
import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@ -278,6 +281,26 @@ public class TestRMEmbeddedElector extends ClientBaseWithFixes {
verify(as, atMost(1)).transitionToStandby(any()); verify(as, atMost(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 class MockRMWithElector extends MockRM {
private long delayMs = 0; private long delayMs = 0;