package org.goldenorb.server; import java.util.Map; import java.util.Set; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.ZooKeeper; import org.goldenorb.client.OrbTrackerMemberData; import org.goldenorb.conf.OrbConfiguration; import org.goldenorb.jet.OrbTrackerMember; import org.goldenorb.zookeeper.OrbZKFailure; import org.goldenorb.zookeeper.ZookeeperUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertTrue; public class TestLeaderGroupMemberMonitor { private static ZooKeeper zk; private static String leaderGroupPath; /** * Sets up zookeeper and nodes for testing. * * @throws Exception */ @BeforeClass public static void setUpBeforeClass() throws Exception { OrbConfiguration orbConf = new OrbConfiguration(true); orbConf.setOrbZooKeeperQuorum("localhost:21810"); zk = ZookeeperUtils.connect(orbConf.getOrbZooKeeperQuorum()); ZookeeperUtils.tryToCreateNode(zk, "/GoldenOrb"); ZookeeperUtils.tryToCreateNode(zk, "/GoldenOrb/Test"); ZookeeperUtils.tryToCreateNode(zk, "/GoldenOrb/Test/OrbTrackerLeaderGroup"); leaderGroupPath = "/GoldenOrb/Test/OrbTrackerLeaderGroup"; } /** * Remove nodes used for testing * * @throws Exception */ @AfterClass public static void tearDownAfterClass() throws Exception { ZookeeperUtils.recursiveDelete(zk, "/GolenOrb"); } /** * Test a single change to a member node * * @throws OrbZKFailure * @throws InterruptedException */ @Test public void testSingleMemberDataChange() throws OrbZKFailure, InterruptedException { CountDownLatch cdlatch = new CountDownLatch(1); TServer server = new TServer(cdlatch); OrbTrackerMember otm = new OrbTrackerMember(); otm.setAvailablePartitions(1); otm.setHostname("TEST"); otm.setInUsePartitions(1); otm.setLeader(true); otm.setPartitionCapacity(1); otm.setPort(1); otm.setReservedPartitions(1); String path = ZookeeperUtils.tryToCreateNode(zk, leaderGroupPath + "/member", otm, CreateMode.EPHEMERAL_SEQUENTIAL); new LeaderGroupMemberMonitor(path, zk, path.split("/")[3], server); cdlatch.await(); Map<String,OrbTrackerMemberData> map = server.getMemberData(); assertTrue(map.size() == 1); Set<String> keys = map.keySet(); assertTrue(keys.size() == 1); String nodeName = ""; for (String key : keys) { nodeName = key; } assertTrue(nodeName.equals(path.split("/")[3])); assertTrue(map.get(nodeName).getAvailablePartitions() == otm.getAvailablePartitions()); assertTrue(map.get(nodeName).getPort() == otm.getPort()); otm.setAvailablePartitions(9); cdlatch = new CountDownLatch(1); server.setLatcher(cdlatch); ZookeeperUtils.setNodeData(zk, path, otm); cdlatch.await(); map = server.getMemberData(); assertTrue(map.size() == 1); keys = map.keySet(); assertTrue(keys.size() == 1); nodeName = ""; for (String key : keys) { nodeName = key; } assertTrue(nodeName.equals(path.split("/")[3])); assertTrue(map.get(nodeName).getAvailablePartitions() == otm.getAvailablePartitions()); } /** * Test multiple changes to a single member node * * @throws OrbZKFailure * @throws InterruptedException */ public void testMulitpleChanges() throws OrbZKFailure, InterruptedException { CountDownLatch cdlatch = new CountDownLatch(1); TServer server = new TServer(cdlatch); OrbTrackerMember otm = new OrbTrackerMember(); otm.setAvailablePartitions(1); otm.setHostname("TEST"); otm.setInUsePartitions(1); otm.setLeader(true); otm.setPartitionCapacity(1); otm.setPort(1); otm.setReservedPartitions(1); String path = ZookeeperUtils.tryToCreateNode(zk, leaderGroupPath + "/member", otm, CreateMode.EPHEMERAL_SEQUENTIAL); new LeaderGroupMemberMonitor(path, zk, path.split("/")[3], server); cdlatch.await(); Map<String,OrbTrackerMemberData> map = server.getMemberData(); assertTrue(map.size() == 1); Set<String> keys = map.keySet(); assertTrue(keys.size() == 1); String nodeName = ""; for (String key : keys) { nodeName = key; } assertTrue(nodeName.equals(path.split("/")[3])); assertTrue(map.get(nodeName).getAvailablePartitions() == otm.getAvailablePartitions()); assertTrue(map.get(nodeName).getPort() == otm.getPort()); otm.setAvailablePartitions(9); cdlatch = new CountDownLatch(1); server.setLatcher(cdlatch); ZookeeperUtils.setNodeData(zk, path, otm); cdlatch.await(); map = server.getMemberData(); assertTrue(map.size() == 1); keys = map.keySet(); assertTrue(keys.size() == 1); nodeName = ""; for (String key : keys) { nodeName = key; } assertTrue(nodeName.equals(path.split("/")[3])); assertTrue(map.get(nodeName).getAvailablePartitions() == otm.getAvailablePartitions()); cdlatch = new CountDownLatch(1); server.setLatcher(cdlatch); otm.setHostname("Hostname"); ZookeeperUtils.setNodeData(zk, path, otm); cdlatch.await(); map = server.getMemberData(); assertTrue(map.size() == 1); keys = map.keySet(); assertTrue(keys.size() == 1); nodeName = ""; for (String key : keys) { nodeName = key; } assertTrue(nodeName.equals(path.split("/")[3])); assertTrue(map.get(nodeName).getHostname() == otm.getHostname()); cdlatch = new CountDownLatch(1); server.setLatcher(cdlatch); otm.setHostname("Host"); ZookeeperUtils.setNodeData(zk, path, otm); cdlatch.await(); map = server.getMemberData(); assertTrue(map.size() == 1); keys = map.keySet(); assertTrue(keys.size() == 1); nodeName = ""; for (String key : keys) { nodeName = key; } assertTrue(nodeName.equals(path.split("/")[3])); assertTrue(map.get(nodeName).getHostname() == otm.getHostname()); } }