package zx.soft.zookeeper.book;
import java.util.ArrayList;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import zx.soft.zookeeper.book.Client;
import zx.soft.zookeeper.book.Worker;
import zx.soft.zookeeper.book.Client.TaskObject;
import zx.soft.zookeeper.book.curator.CuratorMasterLatch;
import zx.soft.zookeeper.book.curator.CuratorMasterSelector;
public class TestCuratorMaster extends BaseTestCase {
private static final Logger logger = LoggerFactory.getLogger(TestTaskAssignment.class);
@Test(timeout = 60000)
public void testTaskAssignment() throws Exception {
logger.info("Starting master (taskAssignment)");
CuratorMasterSelector master = new CuratorMasterSelector("M1", "localhost:" + port,
new ExponentialBackoffRetry(1000, 5));
master.startZK();
master.bootstrap();
master.runForMaster();
logger.info("Going to wait for leadership");
master.awaitLeadership();
logger.info("Starting worker");
Worker worker1 = new Worker("localhost:" + port);
Worker worker2 = new Worker("localhost:" + port);
Worker worker3 = new Worker("localhost:" + port);
worker1.startZK();
worker2.startZK();
worker3.startZK();
while (!worker1.isConnected() && !worker2.isConnected() && !worker3.isConnected()) {
Thread.sleep(100);
}
/*
* bootstrap() create some necessary znodes.
*/
worker1.bootstrap();
worker2.bootstrap();
worker3.bootstrap();
/*
* Registers this worker so that the leader knows that
* it is here.
*/
worker1.register();
worker2.register();
worker3.register();
worker1.getTasks();
worker2.getTasks();
worker3.getTasks();
logger.info("Starting client");
Client client = new Client("localhost:" + port);
client.startZK();
while (!client.isConnected() && !worker1.isConnected() && !worker2.isConnected() && !worker3.isConnected()) {
Thread.sleep(100);
}
TaskObject task = null;
for (int i = 1; i < 200; i++) {
task = new TaskObject();
client.submitTask("Sample task taskAssignment " + i, task);
task.waitUntilDone();
Assert.assertTrue("Task not done", task.isDone());
}
worker1.close();
worker2.close();
worker3.close();
master.close();
client.close();
}
@Test(timeout = 60000)
public void testZooKeeperRestart() throws Exception {
logger.info("Starting zookeeper restart");
CuratorMasterSelector master = new CuratorMasterSelector("M1", "localhost:" + port,
new ExponentialBackoffRetry(1000, 5));
master.startZK();
master.bootstrap();
logger.info("Starting worker");
Worker worker1 = new Worker("localhost:" + port);
Worker worker2 = new Worker("localhost:" + port);
Worker worker3 = new Worker("localhost:" + port);
worker1.startZK();
worker2.startZK();
worker3.startZK();
while (!worker1.isConnected() && !worker2.isConnected() && !worker3.isConnected()) {
Thread.sleep(100);
}
/*
* bootstrap() create some necessary znodes.
*/
worker1.bootstrap();
worker2.bootstrap();
worker3.bootstrap();
/*
* Registers this worker so that the leader knows that
* it is here.
*/
worker1.register();
worker2.register();
worker3.register();
worker1.getTasks();
worker2.getTasks();
worker3.getTasks();
logger.info("Starting client");
Client client = new Client("localhost:" + port);
client.startZK();
while (!client.isConnected() && !worker1.isConnected() && !worker2.isConnected() && !worker3.isConnected()) {
Thread.sleep(100);
}
int numTasks = 200;
TaskObject task = null;
ArrayList<TaskObject> taskList = new ArrayList<TaskObject>(numTasks);
for (int i = 0; i < numTasks; i++) {
task = new TaskObject();
client.submitTask("Sample task zkRestart " + i, task);
taskList.add(task);
}
/*
* Restart ZK server
*/
logger.info("Restarting ZooKeeper");
restartServer();
/*
* Now try to get mastership
*/
master.runForMaster();
logger.info("Going to wait for leadership");
master.awaitLeadership();
for (int i = 0; i < numTasks; i++) {
taskList.get(i).waitUntilDone();
Assert.assertTrue("Task not done", taskList.get(i).isDone());
}
/*
* Wrapping up
*/
worker1.close();
worker2.close();
worker3.close();
master.close();
client.close();
}
@Test(timeout = 30000)
public void electSingleMaster() throws Exception {
logger.info("Starting single master test");
CuratorMasterSelector master = new CuratorMasterSelector("M1", "localhost:" + port,
new ExponentialBackoffRetry(1000, 5));
CuratorMasterSelector bmaster = new CuratorMasterSelector("M2", "localhost:" + port,
new ExponentialBackoffRetry(1000, 5));
logger.info("Starting ZooKeeper for M1");
master.startZK();
logger.info("Starting ZooKeeper for M2");
bmaster.startZK();
master.bootstrap();
//bm.bootstrap();
bmaster.runForMaster();
master.runForMaster();
while (!master.isLeader() && !bmaster.isLeader()) {
logger.info("m: " + master.isLeader() + ", bm: " + bmaster.isLeader());
Thread.sleep(100);
}
boolean singleMaster = ((master.isLeader() && !bmaster.isLeader()) || (!master.isLeader() && bmaster.isLeader()));
Assert.assertTrue("Master not elected.", singleMaster);
master.close();
bmaster.close();
}
@Test(timeout = 60000)
public void testTaskAssignmentLatch() throws Exception {
logger.info("Starting master (taskAssignment)");
CuratorMasterLatch master = new CuratorMasterLatch("M1", "localhost:" + port, new ExponentialBackoffRetry(1000,
5));
master.startZK();
master.bootstrap();
master.runForMaster();
logger.info("Going to wait for leadership");
master.awaitLeadership();
logger.info("Starting worker");
Worker worker1 = new Worker("localhost:" + port);
Worker worker2 = new Worker("localhost:" + port);
Worker worker3 = new Worker("localhost:" + port);
worker1.startZK();
worker2.startZK();
worker3.startZK();
while (!worker1.isConnected() && !worker2.isConnected() && !worker3.isConnected()) {
Thread.sleep(100);
}
/*
* bootstrap() create some necessary znodes.
*/
worker1.bootstrap();
worker2.bootstrap();
worker3.bootstrap();
/*
* Registers this worker so that the leader knows that
* it is here.
*/
worker1.register();
worker2.register();
worker3.register();
worker1.getTasks();
worker2.getTasks();
worker3.getTasks();
logger.info("Starting client");
Client client = new Client("localhost:" + port);
client.startZK();
while (!client.isConnected() && !worker1.isConnected() && !worker2.isConnected() && !worker3.isConnected()) {
Thread.sleep(100);
}
TaskObject task = null;
for (int i = 1; i < 200; i++) {
task = new TaskObject();
client.submitTask("Sample task taskAssignment " + i, task);
task.waitUntilDone();
Assert.assertTrue("Task not done", task.isDone());
}
worker1.close();
worker2.close();
worker3.close();
master.close();
client.close();
}
}