Author: breed Date: Fri Sep 5 07:39:28 2008 New Revision: 692452 URL: http://svn.apache.org/viewvc?rev=692452&view=rev Log: ZOOKEEPER-133 hudson tests failing intermittently
Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/ClientTest.java hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/ClientTest.java URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/ClientTest.java?rev=692452&r1=692451&r2=692452&view=diff ============================================================================== --- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/ClientTest.java (original) +++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/ClientTest.java Fri Sep 5 07:39:28 2008 @@ -43,9 +43,6 @@ public class ClientTest extends ClientBase { protected static final Logger LOG = Logger.getLogger(ClientTest.class); - LinkedBlockingQueue<WatcherEvent> events = - new LinkedBlockingQueue<WatcherEvent>(); - @Override protected void tearDown() throws Exception { super.tearDown(); @@ -145,7 +142,10 @@ } } - protected class MyWatcher extends CountdownWatcher { + private class MyWatcher extends CountdownWatcher { + LinkedBlockingQueue<WatcherEvent> events = + new LinkedBlockingQueue<WatcherEvent>(); + public void process(WatcherEvent event) { super.process(event); if (event.getType() != Event.EventNone) { @@ -157,13 +157,132 @@ } } } + + /** + * Register multiple watchers and verify that they all get notified and + * in the right order. + */ + @Test + public void testMutipleWatcherObjs() + throws IOException, InterruptedException, KeeperException + { + ZooKeeper zk = createClient(new CountdownWatcher(), hostPort); + try { + MyWatcher watchers[] = new MyWatcher[100]; + MyWatcher watchers2[] = new MyWatcher[watchers.length]; + for (int i = 0; i < watchers.length; i++) { + watchers[i] = new MyWatcher(); + watchers2[i] = new MyWatcher(); + zk.create("/foo-" + i, ("foodata" + i).getBytes(), + Ids.OPEN_ACL_UNSAFE, 0); + } + Stat stat = new Stat(); + + // + // test get/exists with single set of watchers + // get all, then exists all + // + for (int i = 0; i < watchers.length; i++) { + assertNotNull(zk.getData("/foo-" + i, watchers[i], stat)); + } + for (int i = 0; i < watchers.length; i++) { + assertNotNull(zk.exists("/foo-" + i, watchers[i])); + } + // trigger the watches + for (int i = 0; i < watchers.length; i++) { + zk.setData("/foo-" + i, ("foodata2-" + i).getBytes(), -1); + zk.setData("/foo-" + i, ("foodata3-" + i).getBytes(), -1); + } + for (int i = 0; i < watchers.length; i++) { + WatcherEvent event = + watchers[i].events.poll(10, TimeUnit.SECONDS); + assertEquals("/foo-" + i, event.getPath()); + assertEquals(Event.EventNodeDataChanged, event.getType()); + assertEquals(Event.KeeperStateSyncConnected, event.getState()); + + // small chance that an unexpected message was delivered + // after this check, but we would catch that next time + // we check events + assertEquals(0, watchers[i].events.size()); + } + + // + // test get/exists with single set of watchers + // get/exists together + // + for (int i = 0; i < watchers.length; i++) { + assertNotNull(zk.getData("/foo-" + i, watchers[i], stat)); + assertNotNull(zk.exists("/foo-" + i, watchers[i])); + } + // trigger the watches + for (int i = 0; i < watchers.length; i++) { + zk.setData("/foo-" + i, ("foodata4-" + i).getBytes(), -1); + zk.setData("/foo-" + i, ("foodata5-" + i).getBytes(), -1); + } + for (int i = 0; i < watchers.length; i++) { + WatcherEvent event = + watchers[i].events.poll(10, TimeUnit.SECONDS); + assertEquals("/foo-" + i, event.getPath()); + assertEquals(Event.EventNodeDataChanged, event.getType()); + assertEquals(Event.KeeperStateSyncConnected, event.getState()); + + // small chance that an unexpected message was delivered + // after this check, but we would catch that next time + // we check events + assertEquals(0, watchers[i].events.size()); + } + + // + // test get/exists with two sets of watchers + // + for (int i = 0; i < watchers.length; i++) { + assertNotNull(zk.getData("/foo-" + i, watchers[i], stat)); + assertNotNull(zk.exists("/foo-" + i, watchers2[i])); + } + // trigger the watches + for (int i = 0; i < watchers.length; i++) { + zk.setData("/foo-" + i, ("foodata6-" + i).getBytes(), -1); + zk.setData("/foo-" + i, ("foodata7-" + i).getBytes(), -1); + } + for (int i = 0; i < watchers.length; i++) { + WatcherEvent event = + watchers[i].events.poll(10, TimeUnit.SECONDS); + assertEquals("/foo-" + i, event.getPath()); + assertEquals(Event.EventNodeDataChanged, event.getType()); + assertEquals(Event.KeeperStateSyncConnected, event.getState()); + + // small chance that an unexpected message was delivered + // after this check, but we would catch that next time + // we check events + assertEquals(0, watchers[i].events.size()); + + // watchers2 + WatcherEvent event2 = + watchers2[i].events.poll(10, TimeUnit.SECONDS); + assertEquals("/foo-" + i, event2.getPath()); + assertEquals(Event.EventNodeDataChanged, event2.getType()); + assertEquals(Event.KeeperStateSyncConnected, event2.getState()); + + // small chance that an unexpected message was delivered + // after this check, but we would catch that next time + // we check events + assertEquals(0, watchers2[i].events.size()); + } + + } finally { + if (zk != null) { + zk.close(); + } + } + } private void performClientTest(boolean withWatcherObj) throws IOException, InterruptedException, KeeperException { ZooKeeper zk = null; try { - zk = createClient(new MyWatcher(), hostPort); + MyWatcher watcher = new MyWatcher(); + zk = createClient(watcher, hostPort); //LOG.info("Created client: " + zk.describeCNXN()); LOG.info("Before create /benwashere"); zk.create("/benwashere", "".getBytes(), Ids.OPEN_ACL_UNSAFE, 0); @@ -182,7 +301,8 @@ zk.close(); //LOG.info("Closed client: " + zk.describeCNXN()); Thread.sleep(2000); - zk = createClient(new MyWatcher(), hostPort); + + zk = createClient(watcher, hostPort); //LOG.info("Created a new client: " + zk.describeCNXN()); LOG.info("Before delete /"); @@ -203,9 +323,10 @@ String value = new String(zk.getData("/ben", false, stat)); assertEquals("Ben was here", value); // Test stat and watch of non existent node + try { if (withWatcherObj) { - assertEquals(null, zk.exists("/frog", new MyWatcher())); + assertEquals(null, zk.exists("/frog", watcher)); } else { assertEquals(null, zk.exists("/frog", true)); } @@ -214,9 +335,10 @@ // OK, expected that } zk.create("/frog", "hi".getBytes(), Ids.OPEN_ACL_UNSAFE, 0); - // the first poll is just a sesssion delivery - LOG.info("Comment: checking for events length " + events.size()); - WatcherEvent event = events.poll(10, TimeUnit.SECONDS); + // the first poll is just a session delivery + LOG.info("Comment: checking for events length " + + watcher.events.size()); + WatcherEvent event = watcher.events.poll(10, TimeUnit.SECONDS); assertEquals("/frog", event.getPath()); assertEquals(Event.EventNodeCreated, event.getType()); assertEquals(Event.KeeperStateSyncConnected, event.getState()); @@ -234,30 +356,30 @@ assertTrue("starts with -", name.startsWith(i + "-")); byte b[]; if (withWatcherObj) { - b = zk.getData("/ben/" + name, new MyWatcher(), stat); + b = zk.getData("/ben/" + name, watcher, stat); } else { b = zk.getData("/ben/" + name, true, stat); } assertEquals(Integer.toString(i), new String(b)); zk.setData("/ben/" + name, "new".getBytes(), stat.getVersion()); if (withWatcherObj) { - stat = zk.exists("/ben/" + name, new MyWatcher()); + stat = zk.exists("/ben/" + name, watcher); } else { stat = zk.exists("/ben/" + name, true); } zk.delete("/ben/" + name, stat.getVersion()); } - event = events.poll(10, TimeUnit.SECONDS); + event = watcher.events.poll(10, TimeUnit.SECONDS); assertEquals("/ben", event.getPath()); assertEquals(Event.EventNodeChildrenChanged, event.getType()); assertEquals(Event.KeeperStateSyncConnected, event.getState()); for (int i = 0; i < 10; i++) { - event = events.poll(10, TimeUnit.SECONDS); + event = watcher.events.poll(10, TimeUnit.SECONDS); final String name = children.get(i); assertEquals("/ben/" + name, event.getPath()); assertEquals(Event.EventNodeDataChanged, event.getType()); assertEquals(Event.KeeperStateSyncConnected, event.getState()); - event = events.poll(10, TimeUnit.SECONDS); + event = watcher.events.poll(10, TimeUnit.SECONDS); assertEquals("/ben/" + name, event.getPath()); assertEquals(Event.EventNodeDeleted, event.getType()); assertEquals(Event.KeeperStateSyncConnected, event.getState()); Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java?rev=692452&r1=692451&r2=692452&view=diff ============================================================================== --- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java (original) +++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumTest.java Fri Sep 5 07:39:28 2008 @@ -35,7 +35,7 @@ public class QuorumTest extends ClientBase { private static final Logger LOG = Logger.getLogger(QuorumTest.class); - private ClientTest ct = new ClientTest(); + private final ClientTest ct = new ClientTest(); File s1dir, s2dir, s3dir, s4dir, s5dir; QuorumPeer s1, s2, s3, s4, s5; @@ -55,9 +55,9 @@ s3dir = ClientBase.createTmpDir(); s4dir = ClientBase.createTmpDir(); s5dir = ClientBase.createTmpDir(); - + startServers(); - + LOG.info("Setup finished"); } void startServers() throws IOException, InterruptedException { @@ -137,17 +137,17 @@ public void testDeleteWithChildren() throws Exception { ct.testDeleteWithChildren(); } - + @Test public void testHammerBasic() throws Throwable { ct.testHammerBasic(); } - + @Test public void testPing() throws Exception { ct.testPing(); } - + @Test public void testSequentialNodeNames() throws IOException, InterruptedException, KeeperException @@ -173,6 +173,12 @@ { ct.testClientWithWatcherObj(); } - + @Test + public void testMultipleWatcherObjs() throws IOException, + InterruptedException, KeeperException + { + ct.testMutipleWatcherObjs(); + } + // skip superhammer and clientcleanup as they are too expensive for quorum }