package org.apache.hadoop.hdfs;
import java.util.Random;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdfs.MiniAvatarCluster.NameNodeInfo;
import org.apache.hadoop.hdfs.protocol.AvatarConstants;
import org.apache.hadoop.hdfs.protocol.AvatarConstants.StartupOption;
import org.apache.hadoop.hdfs.server.namenode.AvatarNode;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import static org.junit.Assert.*;
import org.junit.Test;
public class TestAvatarMultipleStartup {
private static MiniAvatarCluster cluster;
private static Configuration conf;
private static AvatarZooKeeperClient zkClient;
private static final Random r = new Random();
private static final Log LOG = LogFactory
.getLog(TestAvatarMultipleStartup.class);
@BeforeClass
public static void setUpBeforeClass() throws Exception {
MiniAvatarCluster.createAndStartZooKeeper();
}
public void setUp(boolean federation) throws Exception {
conf = new Configuration();
conf.setBoolean("dfs.avatarnode.startup.testing", true);
if (federation) {
cluster = new MiniAvatarCluster(conf, 1, true, null, null,
2 + r.nextInt(4), true);
} else {
cluster = new MiniAvatarCluster(conf, 1, true, null, null);
}
zkClient = new AvatarZooKeeperClient(conf, null);
}
@After
public void tearDown() throws Exception {
zkClient.shutdown();
cluster.shutDown();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
MiniAvatarCluster.shutDownZooKeeper();
}
private long getSessionId(int index) throws Exception {
AvatarNode primaryAvatar = cluster.getPrimaryAvatar(index).avatar;
String address = AvatarNode.getClusterAddress(primaryAvatar
.getStartupConf());
return zkClient.getPrimarySsId(address);
}
private void verifyStartup(boolean federation, int index)
throws Exception {
NameNodeInfo nnInfo = cluster.getNameNode(index);
String[] normalArgs = { AvatarConstants.StartupOption.NODEZERO.getName() };
String[] federationArgs = {
AvatarConstants.StartupOption.NODEZERO.getName(),
StartupOption.SERVICE.getName(), nnInfo.nameserviceId };
String[] args = (federation) ? federationArgs : normalArgs;
AvatarNode primary1 = AvatarNode.createAvatarNode(
args,
MiniAvatarCluster.getServerConf(
AvatarConstants.StartupOption.NODEZERO.getName(), nnInfo));
try {
AvatarNode.createAvatarNode(args, MiniAvatarCluster.getServerConf(
AvatarConstants.StartupOption.NODEONE.getName(), nnInfo));
fail("Did not throw exception");
} catch (Exception e) {
LOG.info("Expected exception : ", e);
assertEquals(primary1.getSessionId(), getSessionId(index));
}
}
@Test
public void testStartup() throws Exception {
setUp(false);
cluster.shutDownAvatarNodes();
int nameNodes = cluster.getNumNameNodes();
for (int i = 0; i < nameNodes; i++) {
verifyStartup(false, i);
}
}
@Test
public void testStartupFederation() throws Exception {
setUp(true);
cluster.shutDownAvatarNodes();
int nameNodes = cluster.getNumNameNodes();
for (int i = 0; i < nameNodes; i++) {
verifyStartup(true, i);
}
}
}