package zx.soft.zookeeper.book;
import java.util.ArrayList;
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.Master;
import zx.soft.zookeeper.book.Worker;
import zx.soft.zookeeper.book.Client.TaskObject;
import zx.soft.zookeeper.book.Master.MasterStates;
public class TestTaskAssignment extends BaseTestCase {
private static final Logger logger = LoggerFactory.getLogger(TestTaskAssignment.class);
@Test(timeout = 50000)
public void taskAssignmentSequential() throws Exception {
logger.info("Starting master - Sequential");
Master master = new Master("localhost:" + port);
master.startZK();
while (!master.isConnected()) {
Thread.sleep(500);
}
master.bootstrap();
master.runForMaster();
while (master.getState() == MasterStates.RUNNING) {
Thread.sleep(100);
}
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();
worker1.getTasks();
worker2.register();
worker2.getTasks();
worker3.register();
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", task);
task.waitUntilDone();
Assert.assertTrue("Task not done", task.isDone());
}
master.close();
worker1.close();
worker2.close();
worker3.close();
client.close();
}
@Test(timeout = 50000)
public void taskAssignmentParallel() throws Exception {
logger.info("Starting master - Parallel");
Master master = new Master("localhost:" + port);
master.startZK();
while (!master.isConnected()) {
Thread.sleep(500);
}
master.bootstrap();
master.runForMaster();
while (master.getState() == MasterStates.RUNNING) {
Thread.sleep(100);
}
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();
worker1.getTasks();
worker2.register();
worker2.getTasks();
worker3.register();
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);
}
ArrayList<TaskObject> tasks = new ArrayList<TaskObject>();
for (int i = 1; i < 200; i++) {
TaskObject task = new TaskObject();
client.submitTask("Sample task", task);
}
for (TaskObject task : tasks) {
task.waitUntilDone();
Assert.assertTrue("Task not done", task.isDone());
}
master.close();
worker1.close();
worker2.close();
worker3.close();
client.close();
}
@Test(timeout = 50000)
public void taskZooKeeperCrash() throws Exception {
logger.info("Starting master - ZooKeeper Crash");
Master master = new Master("localhost:" + port);
master.startZK();
while (!master.isConnected()) {
Thread.sleep(500);
}
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();
worker1.getTasks();
worker2.register();
worker2.getTasks();
worker3.register();
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", task);
}
/*
* Restart ZooKeeper server
*/
restartServer();
logger.info("ZooKeeper server restarted");
/*
* Let's start a new master
*/
master.runForMaster();
/*
* ... and wait until the master is up
*/
while (master.getState() == MasterStates.RUNNING) {
Thread.sleep(100);
}
if (task != null) {
logger.info("Task I'm waiting for: " + task.getTaskName());
task.waitUntilDone();
} else {
logger.error("Task is null.");
}
master.close();
worker1.close();
worker2.close();
worker3.close();
client.close();
}
}