http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/java/org/apache/zookeeper/test/WatcherTest.java ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/WatcherTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/WatcherTest.java new file mode 100644 index 0000000..1c06690 --- /dev/null +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/WatcherTest.java @@ -0,0 +1,408 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zookeeper.test; + +import java.io.IOException; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.apache.zookeeper.ClientCnxn; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.TestableZooKeeper; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.AsyncCallback.StatCallback; +import org.apache.zookeeper.AsyncCallback.VoidCallback; +import org.apache.zookeeper.Watcher.Event; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.data.Stat; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class WatcherTest extends ClientBase { + protected static final Logger LOG = LoggerFactory.getLogger(WatcherTest.class); + + private long timeOfLastWatcherInvocation; + + private final class MyStatCallback implements StatCallback { + int rc; + public void processResult(int rc, String path, Object ctx, Stat stat) { + ((int[])ctx)[0]++; + this.rc = rc; + } + } + + private class MyWatcher extends CountdownWatcher { + LinkedBlockingQueue<WatchedEvent> events = + new LinkedBlockingQueue<WatchedEvent>(); + + public void process(WatchedEvent event) { + super.process(event); + if (event.getType() != Event.EventType.None) { + timeOfLastWatcherInvocation = System.currentTimeMillis(); + try { + events.put(event); + } catch (InterruptedException e) { + LOG.warn("ignoring interrupt during event.put"); + } + } + } + } + + @Before + public void setUp() throws Exception { + super.setUp(); + // Reset to default value since some test cases set this to true. + // Needed for JDK7 since unit test can run is random order + ClientCnxn.setDisableAutoResetWatch(false); + } + + /** + * Verify that we get all of the events we expect to get. This particular + * case verifies that we see all of the data events on a particular node. + * There was a bug (ZOOKEEPER-137) that resulted in events being dropped + * in some cases (timing). + * + * @throws IOException + * @throws InterruptedException + * @throws KeeperException + */ + @Test + public void testWatcherCorrectness() + throws IOException, InterruptedException, KeeperException + { + ZooKeeper zk = null; + try { + MyWatcher watcher = new MyWatcher(); + zk = createClient(watcher, hostPort); + + StatCallback scb = new StatCallback() { + public void processResult(int rc, String path, Object ctx, + Stat stat) { + // don't do anything + } + }; + VoidCallback vcb = new VoidCallback() { + public void processResult(int rc, String path, Object ctx) { + // don't do anything + } + }; + + String names[] = new String[10]; + for (int i = 0; i < names.length; i++) { + String name = zk.create("/tc-", "initialvalue".getBytes(), + Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); + names[i] = name; + + Stat stat = new Stat(); + zk.getData(name, watcher, stat); + zk.setData(name, "new".getBytes(), stat.getVersion(), scb, null); + stat = zk.exists(name, watcher); + zk.delete(name, stat.getVersion(), vcb, null); + } + + for (int i = 0; i < names.length; i++) { + String name = names[i]; + WatchedEvent event = watcher.events.poll(10, TimeUnit.SECONDS); + Assert.assertEquals(name, event.getPath()); + Assert.assertEquals(Event.EventType.NodeDataChanged, event.getType()); + Assert.assertEquals(Event.KeeperState.SyncConnected, event.getState()); + event = watcher.events.poll(10, TimeUnit.SECONDS); + Assert.assertEquals(name, event.getPath()); + Assert.assertEquals(Event.EventType.NodeDeleted, event.getType()); + Assert.assertEquals(Event.KeeperState.SyncConnected, event.getState()); + } + } finally { + if (zk != null) { + zk.close(); + } + } + } + + @Test + public void testWatcherCount() + throws IOException, InterruptedException, KeeperException { + ZooKeeper zk1 = null, zk2 = null; + try { + MyWatcher w1 = new MyWatcher(); + zk1 = createClient(w1, hostPort); + + MyWatcher w2 = new MyWatcher(); + zk2 = createClient(w2, hostPort); + + Stat stat = new Stat(); + zk1.create("/watch-count-test", "value".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + zk1.create("/watch-count-test-2", "value".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + + zk1.getData("/watch-count-test", w1, stat); + zk1.getData("/watch-count-test-2", w1, stat); + zk2.getData("/watch-count-test", w2, stat); + + Assert.assertEquals(ClientBase.getServer(serverFactory) + .getZKDatabase().getDataTree().getWatchCount(), 3); + + } finally { + if(zk1 != null) { + zk1.close(); + } + if(zk2 != null) { + zk2.close(); + } + } + + } + + final static int COUNT = 100; + /** + * This test checks that watches for pending requests do not get triggered, + * but watches set by previous requests do. + * + * @throws Exception + */ + @Test + public void testWatchAutoResetWithPending() throws Exception { + MyWatcher watches[] = new MyWatcher[COUNT]; + MyStatCallback cbs[] = new MyStatCallback[COUNT]; + MyWatcher watcher = new MyWatcher(); + int count[] = new int[1]; + TestableZooKeeper zk = createClient(watcher, hostPort, 6000); + ZooKeeper zk2 = createClient(watcher, hostPort, 5000); + zk2.create("/test", new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + for(int i = 0; i < COUNT/2; i++) { + watches[i] = new MyWatcher(); + cbs[i] = new MyStatCallback(); + zk.exists("/test", watches[i], cbs[i], count); + } + zk.exists("/test", false); + Assert.assertTrue("Failed to pause the connection!", zk.pauseCnxn(3000)); + zk2.close(); + stopServer(); + watches[0].waitForDisconnected(60000); + for(int i = COUNT/2; i < COUNT; i++) { + watches[i] = new MyWatcher(); + cbs[i] = new MyStatCallback(); + zk.exists("/test", watches[i], cbs[i], count); + } + startServer(); + watches[COUNT/2-1].waitForConnected(60000); + Assert.assertEquals(null, zk.exists("/test", false)); + waitForAllWatchers(); + for(int i = 0; i < COUNT/2; i++) { + Assert.assertEquals("For " + i, 1, watches[i].events.size()); + } + for(int i = COUNT/2; i < COUNT; i++) { + if (cbs[i].rc == 0) { + Assert.assertEquals("For " +i, 1, watches[i].events.size()); + } else { + Assert.assertEquals("For " +i, 0, watches[i].events.size()); + } + } + Assert.assertEquals(COUNT, count[0]); + zk.close(); + } + + /** + * Wait until no watcher has been fired in the last second to ensure that all watches + * that are waiting to be fired have been fired + * @throws Exception + */ + private void waitForAllWatchers() throws Exception { + timeOfLastWatcherInvocation = System.currentTimeMillis(); + while (System.currentTimeMillis() - timeOfLastWatcherInvocation < 1000) { + Thread.sleep(1000); + } + } + + final int TIMEOUT = 5000; + + @Test + public void testWatcherAutoResetWithGlobal() throws Exception { + ZooKeeper zk = null; + MyWatcher watcher = new MyWatcher(); + zk = createClient(watcher, hostPort, TIMEOUT); + testWatcherAutoReset(zk, watcher, watcher); + zk.close(); + } + + @Test + public void testWatcherAutoResetWithLocal() throws Exception { + ZooKeeper zk = null; + MyWatcher watcher = new MyWatcher(); + zk = createClient(watcher, hostPort, TIMEOUT); + testWatcherAutoReset(zk, watcher, new MyWatcher()); + zk.close(); + } + + @Test + public void testWatcherAutoResetDisabledWithGlobal() throws Exception { + ClientCnxn.setDisableAutoResetWatch(true); + testWatcherAutoResetWithGlobal(); + } + + @Test + public void testWatcherAutoResetDisabledWithLocal() throws Exception { + ClientCnxn.setDisableAutoResetWatch(true); + testWatcherAutoResetWithLocal(); + } + + private void testWatcherAutoReset(ZooKeeper zk, MyWatcher globalWatcher, + MyWatcher localWatcher) throws Exception { + boolean isGlobal = (localWatcher == globalWatcher); + // First test to see if the watch survives across reconnects + zk.create("/watchtest", new byte[0], Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + zk.create("/watchtest/child", new byte[0], Ids.OPEN_ACL_UNSAFE, + CreateMode.EPHEMERAL); + if (isGlobal) { + zk.getChildren("/watchtest", true); + zk.getData("/watchtest/child", true, new Stat()); + zk.exists("/watchtest/child2", true); + } else { + zk.getChildren("/watchtest", localWatcher); + zk.getData("/watchtest/child", localWatcher, new Stat()); + zk.exists("/watchtest/child2", localWatcher); + } + + Assert.assertTrue(localWatcher.events.isEmpty()); + + stopServer(); + globalWatcher.waitForDisconnected(3000); + localWatcher.waitForDisconnected(500); + startServer(); + globalWatcher.waitForConnected(3000); + if (!isGlobal && !ClientCnxn.getDisableAutoResetWatch()) { + localWatcher.waitForConnected(500); + } + + Assert.assertTrue(localWatcher.events.isEmpty()); + zk.setData("/watchtest/child", new byte[1], -1); + zk.create("/watchtest/child2", new byte[0], Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + + WatchedEvent e; + if (!ClientCnxn.getDisableAutoResetWatch()) { + e = localWatcher.events.poll(TIMEOUT, TimeUnit.MILLISECONDS); + Assert.assertEquals(e.getPath(), EventType.NodeDataChanged, e.getType()); + Assert.assertEquals("/watchtest/child", e.getPath()); + } else { + // we'll catch this later if it does happen after timeout, so + // why waste the time on poll + } + + if (!ClientCnxn.getDisableAutoResetWatch()) { + e = localWatcher.events.poll(TIMEOUT, TimeUnit.MILLISECONDS); + // The create will trigger the get children and the exist + // watches + Assert.assertEquals(EventType.NodeCreated, e.getType()); + Assert.assertEquals("/watchtest/child2", e.getPath()); + } else { + // we'll catch this later if it does happen after timeout, so + // why waste the time on poll + } + + if (!ClientCnxn.getDisableAutoResetWatch()) { + e = localWatcher.events.poll(TIMEOUT, TimeUnit.MILLISECONDS); + Assert.assertEquals(EventType.NodeChildrenChanged, e.getType()); + Assert.assertEquals("/watchtest", e.getPath()); + } else { + // we'll catch this later if it does happen after timeout, so + // why waste the time on poll + } + + Assert.assertTrue(localWatcher.events.isEmpty()); // ensure no late arrivals + stopServer(); + globalWatcher.waitForDisconnected(TIMEOUT); + try { + try { + localWatcher.waitForDisconnected(500); + if (!isGlobal && !ClientCnxn.getDisableAutoResetWatch()) { + Assert.fail("Got an event when I shouldn't have"); + } + } catch(TimeoutException toe) { + if (ClientCnxn.getDisableAutoResetWatch()) { + Assert.fail("Didn't get an event when I should have"); + } + // Else what we are expecting since there are no outstanding watches + } + } catch (Exception e1) { + LOG.error("bad", e1); + throw new RuntimeException(e1); + } + startServer(); + globalWatcher.waitForConnected(TIMEOUT); + + if (isGlobal) { + zk.getChildren("/watchtest", true); + zk.getData("/watchtest/child", true, new Stat()); + zk.exists("/watchtest/child2", true); + } else { + zk.getChildren("/watchtest", localWatcher); + zk.getData("/watchtest/child", localWatcher, new Stat()); + zk.exists("/watchtest/child2", localWatcher); + } + + // Do trigger an event to make sure that we do not get + // it later + zk.delete("/watchtest/child2", -1); + + e = localWatcher.events.poll(TIMEOUT, TimeUnit.MILLISECONDS); + Assert.assertEquals(EventType.NodeDeleted, e.getType()); + Assert.assertEquals("/watchtest/child2", e.getPath()); + + e = localWatcher.events.poll(TIMEOUT, TimeUnit.MILLISECONDS); + Assert.assertEquals(EventType.NodeChildrenChanged, e.getType()); + Assert.assertEquals("/watchtest", e.getPath()); + + Assert.assertTrue(localWatcher.events.isEmpty()); + + stopServer(); + globalWatcher.waitForDisconnected(TIMEOUT); + localWatcher.waitForDisconnected(500); + startServer(); + globalWatcher.waitForConnected(TIMEOUT); + if (!isGlobal && !ClientCnxn.getDisableAutoResetWatch()) { + localWatcher.waitForConnected(500); + } + + zk.delete("/watchtest/child", -1); + zk.delete("/watchtest", -1); + + if (!ClientCnxn.getDisableAutoResetWatch()) { + e = localWatcher.events.poll(TIMEOUT, TimeUnit.MILLISECONDS); + Assert.assertEquals(EventType.NodeDeleted, e.getType()); + Assert.assertEquals("/watchtest/child", e.getPath()); + } else { + // we'll catch this later if it does happen after timeout, so + // why waste the time on poll + } + + // Make sure nothing is straggling! + Thread.sleep(1000); + Assert.assertTrue(localWatcher.events.isEmpty()); + + } + +}
http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java new file mode 100644 index 0000000..c213b2a --- /dev/null +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZkDatabaseCorruptionTest.java @@ -0,0 +1,161 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zookeeper.test; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.Arrays; + +import org.apache.zookeeper.AsyncCallback; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZKTestCase; +import org.apache.zookeeper.ZooDefs; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.server.SyncRequestProcessor; +import org.apache.zookeeper.server.persistence.FileTxnSnapLog; +import org.apache.zookeeper.server.quorum.QuorumPeer; +import org.apache.zookeeper.server.quorum.QuorumPeer.ServerState; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ZkDatabaseCorruptionTest extends ZKTestCase { + protected static final Logger LOG = LoggerFactory.getLogger(ZkDatabaseCorruptionTest.class); + public static final long CONNECTION_TIMEOUT = ClientTest.CONNECTION_TIMEOUT; + + private final QuorumBase qb = new QuorumBase(); + + @Before + public void setUp() throws Exception { + LOG.info("STARTING quorum " + getClass().getName()); + qb.setUp(); + } + + @After + public void tearDown() throws Exception { + LOG.info("STOPPING quorum " + getClass().getName()); + } + + private void corruptFile(File f) throws IOException { + RandomAccessFile outFile = new RandomAccessFile(f, "rw"); + outFile.write("fail servers".getBytes()); + outFile.close(); + } + + private void corruptAllSnapshots(File snapDir) throws IOException { + File[] listFiles = snapDir.listFiles(); + for (File f: listFiles) { + if (f.getName().startsWith("snapshot")) { + corruptFile(f); + } + } + } + + private class NoopStringCallback implements AsyncCallback.StringCallback { + @Override + public void processResult(int rc, String path, Object ctx, + String name) { + } + } + + @Test + public void testCorruption() throws Exception { + ClientBase.waitForServerUp(qb.hostPort, 10000); + ClientBase.waitForServerUp(qb.hostPort, 10000); + ZooKeeper zk = new ZooKeeper(qb.hostPort, 10000, new Watcher() { + public void process(WatchedEvent event) { + }}); + SyncRequestProcessor.setSnapCount(100); + for (int i = 0; i < 2000; i++) { + zk.create("/0-" + i, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT, new NoopStringCallback(), null); + } + zk.close(); + + long leaderSid = 1; + QuorumPeer leader = null; + //find out who is the leader and kill it + for (QuorumPeer quorumPeer : Arrays.asList(qb.s1, qb.s2, qb.s3, qb.s4, qb.s5)) { + if (quorumPeer.getPeerState() == ServerState.LEADING) { + leader = quorumPeer; + break; + } + ++leaderSid; + } + + Assert.assertNotNull("Cannot find the leader.", leader); + leader.shutdown(); + + // now corrupt the leader's database + FileTxnSnapLog snapLog = leader.getTxnFactory(); + File snapDir= snapLog.getSnapDir(); + //corrupt all the snapshot in the snapshot directory + corruptAllSnapshots(snapDir); + qb.shutdownServers(); + qb.setupServers(); + + if (leaderSid != 1)qb.s1.start(); else leader = qb.s1; + if (leaderSid != 2)qb.s2.start(); else leader = qb.s2; + if (leaderSid != 3)qb.s3.start(); else leader = qb.s3; + if (leaderSid != 4)qb.s4.start(); else leader = qb.s4; + if (leaderSid != 5)qb.s5.start(); else leader = qb.s5; + + try { + leader.start(); + Assert.assertTrue(false); + } catch(RuntimeException re) { + LOG.info("Got an error: expected", re); + } + //wait for servers to be up + String[] list = qb.hostPort.split(","); + for (int i = 0; i < 5; i++) { + if(leaderSid != (i + 1)) { + String hp = list[i]; + Assert.assertTrue("waiting for server up", + ClientBase.waitForServerUp(hp, + CONNECTION_TIMEOUT)); + LOG.info("{} is accepting client connections", hp); + } else { + LOG.info("Skipping the leader"); + } + } + + zk = qb.createClient(); + SyncRequestProcessor.setSnapCount(100); + for (int i = 2000; i < 4000; i++) { + zk.create("/0-" + i, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT, new NoopStringCallback(), null); + } + zk.close(); + + if (leaderSid != 1)QuorumBase.shutdown(qb.s1); + if (leaderSid != 2)QuorumBase.shutdown(qb.s2); + if (leaderSid != 3)QuorumBase.shutdown(qb.s3); + if (leaderSid != 4)QuorumBase.shutdown(qb.s4); + if (leaderSid != 5)QuorumBase.shutdown(qb.s5); + } + + +} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperQuotaTest.java ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperQuotaTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperQuotaTest.java new file mode 100644 index 0000000..fbf09b3 --- /dev/null +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperQuotaTest.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zookeeper.test; + +import java.io.IOException; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.Quotas; +import org.apache.zookeeper.StatsTrack; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.ZooKeeperMain; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.data.Stat; +import org.apache.zookeeper.server.ZooKeeperServer; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ZooKeeperQuotaTest extends ClientBase { + + + private static final Logger LOG = LoggerFactory.getLogger( + ZooKeeperQuotaTest.class); + + @Test + public void testQuota() throws IOException, + InterruptedException, KeeperException, Exception { + final ZooKeeper zk = createClient(); + final String path = "/a/b/v"; + // making sure setdata works on / + zk.setData("/", "some".getBytes(), -1); + zk.create("/a", "some".getBytes(), Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + + zk.create("/a/b", "some".getBytes(), Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + + zk.create("/a/b/v", "some".getBytes(), Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + + zk.create("/a/b/v/d", "some".getBytes(), Ids.OPEN_ACL_UNSAFE, + CreateMode.PERSISTENT); + ZooKeeperMain.createQuota(zk, path, 5L, 10); + + // see if its set + String absolutePath = Quotas.quotaZookeeper + path + "/" + Quotas.limitNode; + byte[] data = zk.getData(absolutePath, false, new Stat()); + StatsTrack st = new StatsTrack(new String(data)); + Assert.assertTrue("bytes are set", st.getBytes() == 5L); + Assert.assertTrue("num count is set", st.getCount() == 10); + + String statPath = Quotas.quotaZookeeper + path + "/" + Quotas.statNode; + byte[] qdata = zk.getData(statPath, false, new Stat()); + StatsTrack qst = new StatsTrack(new String(qdata)); + Assert.assertTrue("bytes are set", qst.getBytes() == 8L); + Assert.assertTrue("count is set", qst.getCount() == 2); + + //force server to restart and load from snapshot, not txn log + stopServer(); + startServer(); + stopServer(); + startServer(); + ZooKeeperServer server = getServer(serverFactory); + Assert.assertNotNull("Quota is still set", + server.getZKDatabase().getDataTree().getMaxPrefixWithQuota(path) != null); + } +} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperTestClient.java ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperTestClient.java b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperTestClient.java new file mode 100644 index 0000000..0bbba61 --- /dev/null +++ b/zookeeper-server/src/test/java/org/apache/zookeeper/test/ZooKeeperTestClient.java @@ -0,0 +1,422 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zookeeper.test; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZKTestCase; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.KeeperException.Code; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.common.Time; +import org.apache.zookeeper.data.Stat; +import org.junit.Assert; + +public class ZooKeeperTestClient extends ZKTestCase implements Watcher { + protected String hostPort = "127.0.0.1:22801"; + + protected static final String dirOnZK = "/test_dir"; + + protected String testDirOnZK = dirOnZK + "/" + Time.currentElapsedTime(); + + LinkedBlockingQueue<WatchedEvent> events = new LinkedBlockingQueue<WatchedEvent>(); + + private WatchedEvent getEvent(int numTries) throws InterruptedException { + WatchedEvent event = null; + for (int i = 0; i < numTries; i++) { + System.out.println("i = " + i); + event = events.poll(10, TimeUnit.SECONDS); + if (event != null) { + break; + } + Thread.sleep(5000); + } + return event; + + } + + private void deleteZKDir(ZooKeeper zk, String nodeName) + throws IOException, InterruptedException, KeeperException { + + Stat stat = zk.exists(nodeName, false); + if (stat == null) { + return; + } + + List<String> children1 = zk.getChildren(nodeName, false); + List<String> c2 = zk.getChildren(nodeName, false, stat); + + if (!children1.equals(c2)) { + Assert.fail("children lists from getChildren()/getChildren2() do not match"); + } + + if (!stat.equals(stat)) { + Assert.fail("stats from exists()/getChildren2() do not match"); + } + + if (children1.size() == 0) { + zk.delete(nodeName, -1); + return; + } + for (String n : children1) { + deleteZKDir(zk, n); + } + } + + private void checkRoot() throws IOException, + InterruptedException { + ZooKeeper zk = new ZooKeeper(hostPort, 10000, this); + + try { + zk.create(dirOnZK, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } catch (KeeperException.NodeExistsException ke) { + // expected, sort of + } catch (KeeperException ke) { + Assert.fail("Unexpected exception code for create " + dirOnZK + ": " + + ke.getMessage()); + } + + try { + zk.create(testDirOnZK, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } catch (KeeperException.NodeExistsException ke) { + // expected, sort of + } catch (KeeperException ke) { + Assert.fail("Unexpected exception code for create " + testDirOnZK + ": " + + ke.getMessage()); + } + + zk.close(); + } + + private void enode_test_1() throws IOException, + InterruptedException, KeeperException { + checkRoot(); + String parentName = testDirOnZK; + String nodeName = parentName + "/enode_abc"; + ZooKeeper zk = new ZooKeeper(hostPort, 10000, this); + + Stat stat = zk.exists(parentName, false); + if (stat == null) { + try { + zk.create(parentName, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } catch (KeeperException ke) { + Assert.fail("Creating node " + parentName + ke.getMessage()); + } + } + + try { + zk.create(nodeName, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NODEEXISTS; + if (!valid) { + Assert.fail("Unexpected exception code for createin: " + ke.getMessage()); + } + } + + stat = zk.exists(nodeName, false); + if (stat == null) { + Assert.fail("node " + nodeName + " should exist"); + } + System.out.println("Closing client with sessionid: 0x" + + Long.toHexString(zk.getSessionId())); + zk.close(); + zk = new ZooKeeper(hostPort, 10000, this); + + for (int i = 0; i < 10; i++) { + System.out.println("i = " + i); + stat = zk.exists(nodeName, false); + if (stat != null) { + System.out.println("node " + nodeName + + " should not exist after reconnection close"); + } else { + System.out.println("node " + nodeName + + " is gone after reconnection close!"); + break; + } + Thread.sleep(5000); + } + deleteZKDir(zk, nodeName); + zk.close(); + + } + + private void enode_test_2() throws IOException, + InterruptedException, KeeperException { + checkRoot(); + String parentName = testDirOnZK; + String nodeName = parentName + "/enode_abc"; + ZooKeeper zk = new ZooKeeper(hostPort, 10000, this); + ZooKeeper zk_1 = new ZooKeeper(hostPort, 10000, this); + + Stat stat_parent = zk_1.exists(parentName, false); + if (stat_parent == null) { + try { + zk.create(parentName, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } catch (KeeperException ke) { + Assert.fail("Creating node " + parentName + ke.getMessage()); + } + } + + Stat stat_node = zk_1.exists(nodeName, false); + if (stat_node != null) { + + try { + zk.delete(nodeName, -1); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NONODE + || code == KeeperException.Code.NOTEMPTY; + if (!valid) { + Assert.fail("Unexpected exception code for delete: " + ke.getMessage()); + } + } + } + + List<String> firstGen1 = zk_1.getChildren(parentName, true); + Stat stat = new Stat(); + List<String> firstGen2 = zk_1.getChildren(parentName, true, stat); + + if (!firstGen1.equals(firstGen2)) { + Assert.fail("children lists from getChildren()/getChildren2() do not match"); + } + + if (!stat_parent.equals(stat)) { + Assert.fail("stat from exists()/getChildren() do not match"); + } + + try { + zk.create(nodeName, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NODEEXISTS; + if (!valid) { + Assert.fail("Unexpected exception code for createin: " + ke.getMessage()); + } + } + + Thread.sleep(5000); + WatchedEvent event = events.poll(10, TimeUnit.SECONDS); + if (event == null) { + throw new IOException("No event was delivered promptly"); + } + if (event.getType() != EventType.NodeChildrenChanged + || !event.getPath().equalsIgnoreCase(parentName)) { + Assert.fail("Unexpected event was delivered: " + event.toString()); + } + + stat_node = zk_1.exists(nodeName, false); + if (stat_node == null) { + Assert.fail("node " + nodeName + " should exist"); + } + + try { + zk.delete(parentName, -1); + Assert.fail("Should be impossible to delete a non-empty node " + parentName); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NOTEMPTY; + if (!valid) { + Assert.fail("Unexpected exception code for delete: " + code); + } + } + + try { + zk.create(nodeName + "/def", null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + Assert.fail("Should be impossible to create child off Ephemeral node " + nodeName); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NOCHILDRENFOREPHEMERALS; + if (!valid) { + Assert.fail("Unexpected exception code for createin: " + code); + } + } + + try { + List<String> children1 = zk.getChildren(nodeName, false); + List<String> children2 = zk.getChildren(nodeName, false, null); + + if (!children1.equals(children2)) { + Assert.fail("children lists from getChildren()/getChildren2() does not match"); + } + + if (children1.size() > 0) { + Assert.fail("ephemeral node " + nodeName + " should not have children"); + } + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NONODE; + if (!valid) { + Assert.fail("Unexpected exception code for createin: " + code); + } + } + firstGen1 = zk_1.getChildren(parentName, true); + firstGen2 = zk_1.getChildren(parentName, true, null); + + if (!firstGen1.equals(firstGen2)) { + Assert.fail("children list from getChildren()/getChildren2() does not match"); + } + + stat_node = zk_1.exists(nodeName, true); + if (stat_node == null) { + Assert.fail("node " + nodeName + " should exist"); + } + System.out.println("session id of zk: " + zk.getSessionId()); + System.out.println("session id of zk_1: " + zk_1.getSessionId()); + zk.close(); + + Stat no_stat = zk_1.exists("nosuchnode", false); + + event = this.getEvent(10); + if (event == null) { + throw new Error("First event was not delivered promptly"); + } + if (!((event.getType() == EventType.NodeChildrenChanged && + event.getPath().equalsIgnoreCase(parentName)) || + (event.getType() == EventType.NodeDeleted && + event.getPath().equalsIgnoreCase(nodeName)))) { + System.out.print(parentName + " " + + EventType.NodeChildrenChanged + " " + nodeName + " " + EventType.NodeDeleted); + Assert.fail("Unexpected first event was delivered: " + event.toString()); + } + + event = this.getEvent(10); + + if (event == null) { + throw new Error("Second event was not delivered promptly"); + } + if (!((event.getType() == EventType.NodeChildrenChanged && + event.getPath().equalsIgnoreCase(parentName)) || + (event.getType() == EventType.NodeDeleted && + event.getPath().equalsIgnoreCase(nodeName)))) { + System.out.print(parentName + " " + + EventType.NodeChildrenChanged + " " + nodeName + " " + EventType.NodeDeleted); + Assert.fail("Unexpected second event was delivered: " + event.toString()); + } + + firstGen1 = zk_1.getChildren(parentName, false); + stat_node = zk_1.exists(nodeName, false); + if (stat_node != null) { + Assert.fail("node " + nodeName + " should have been deleted"); + } + if (firstGen1.contains(nodeName)) { + Assert.fail("node " + nodeName + " should not be a children"); + } + deleteZKDir(zk_1, nodeName); + zk_1.close(); + } + + private void delete_create_get_set_test_1() throws + IOException, InterruptedException, KeeperException { + checkRoot(); + ZooKeeper zk = new ZooKeeper(hostPort, 10000, this); + String parentName = testDirOnZK; + String nodeName = parentName + "/benwashere"; + try { + zk.delete(nodeName, -1); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NONODE + || code == KeeperException.Code.NOTEMPTY; + if (!valid) { + Assert.fail("Unexpected exception code for delete: " + ke.getMessage()); + } + } + try { + zk.create(nodeName, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NODEEXISTS; + if (!valid) { + Assert.fail("Unexpected exception code for create: " + ke.getMessage()); + } + } + try { + zk.setData(nodeName, "hi".getBytes(), 5700); + Assert.fail("Should have gotten BadVersion exception"); + } catch (KeeperException ke) { + if (ke.code() != Code.BADVERSION) { + Assert.fail("Should have gotten BadVersion exception"); + } + } + zk.setData(nodeName, "hi".getBytes(), -1); + Stat st = new Stat(); + byte[] bytes = zk.getData(nodeName, false, st); + String retrieved = new String(bytes); + if (!"hi".equals(retrieved)) { + Assert.fail("The retrieved data [" + retrieved + + "] is differented than the expected [hi]"); + } + try { + zk.delete(nodeName, 6800); + Assert.fail("Should have gotten BadVersion exception"); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NOTEMPTY + || code == KeeperException.Code.BADVERSION; + if (!valid) { + Assert.fail("Unexpected exception code for delete: " + ke.getMessage()); + } + } + try { + zk.delete(nodeName, -1); + } catch (KeeperException ke) { + Code code = ke.code(); + boolean valid = code == KeeperException.Code.NOTEMPTY; + if (!valid) { + Assert.fail("Unexpected exception code for delete: " + code); + } + } + deleteZKDir(zk, nodeName); + zk.close(); + } + + public void my_test_1() throws IOException, + InterruptedException, KeeperException { + enode_test_1(); + enode_test_2(); + delete_create_get_set_test_1(); + } + + synchronized public void process(WatchedEvent event) { + try { + System.out.println("Got an event " + event.toString()); + events.put(event); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + ZooKeeperTestClient zktc = new ZooKeeperTestClient(); + try { + zktc.my_test_1(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/check_compatibility.py ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/check_compatibility.py b/zookeeper-server/src/test/resources/check_compatibility.py new file mode 100644 index 0000000..cad8195 --- /dev/null +++ b/zookeeper-server/src/test/resources/check_compatibility.py @@ -0,0 +1,204 @@ +#!/usr/bin/env python +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Script which checks Java API compatibility between two revisions of the +# Java client. +# +# Based on the compatibility checker from the HBase project, but ported to +# Python for better readability. + +# Lifted from Kudu: https://github.com/apache/kudu/blob/master/build-support/check_compatibility.py + +import logging +import optparse +import os +import shutil +import subprocess +import sys + +JAVA_ACC_GIT_URL = "https://github.com/lvc/japi-compliance-checker.git" + +# The annotations for what we consider our public API. +PUBLIC_ANNOTATIONS = ["org.apache.yetus.audience.InterfaceAudience.LimitedPrivate", + "org.apache.yetus.audience.InterfaceAudience.Public"] + +# Various relative paths +PATH_TO_REPO_DIR = "../../../../" +PATH_TO_BUILD_DIR = PATH_TO_REPO_DIR + "build/compat-check" +PATH_TO_JACC_DIR = PATH_TO_REPO_DIR + "build/jacc" + +def check_output(*popenargs, **kwargs): + # r"""Run command with arguments and return its output as a byte string. + # Backported from Python 2.7 as it's implemented as pure python on stdlib. + # >>> check_output(['/usr/bin/python', '--version']) + # Python 2.6.2 + # """ + process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) + output, unused_err = process.communicate() + retcode = process.poll() + if retcode: + cmd = kwargs.get("args") + if cmd is None: + cmd = popenargs[0] + error = subprocess.CalledProcessError(retcode, cmd) + error.output = output + raise error + return output + +def get_repo_dir(): + """ Return the path to the top of the repo. """ + dirname, _ = os.path.split(os.path.abspath(__file__)) + return os.path.abspath(os.path.join(dirname, PATH_TO_REPO_DIR)) + + +def get_scratch_dir(): + """ Return the path to the scratch dir that we build within. """ + dirname, _ = os.path.split(os.path.abspath(__file__)) + return os.path.abspath(os.path.join(dirname, PATH_TO_BUILD_DIR)) + + +def get_java_acc_dir(): + dirname, _ = os.path.split(os.path.abspath(__file__)) + return os.path.abspath(os.path.join(dirname, PATH_TO_JACC_DIR)) + + +def clean_scratch_dir(scratch_dir): + """ Clean up and re-create the scratch directory. """ + if os.path.exists(scratch_dir): + logging.info("Removing scratch dir %s...", scratch_dir) + shutil.rmtree(scratch_dir) + logging.info("Creating empty scratch dir %s...", scratch_dir) + os.makedirs(scratch_dir) + + +def checkout_tree(rev, path): + """ Check out the Java source tree for the given revision into the given path. """ + logging.info("Checking out %s in %s", rev, path) + os.makedirs(path) + # Extract java source + subprocess.check_call(["bash", '-o', 'pipefail', "-c", + ("git archive --format=tar %s | " + + "tar -C \"%s\" -xf -") % (rev, path)], + cwd=get_repo_dir()) + + +def get_git_hash(revname): + """ Convert 'revname' to its SHA-1 hash. """ + return check_output(["git", "rev-parse", revname], + cwd=get_repo_dir()).strip() + + +def build_tree(path): + """ Run the Java build within 'path'. """ + logging.info("Building in %s...", path) + subprocess.check_call(["ant", "jar"], cwd=path) + + +def checkout_java_acc(force): + """ + Check out the Java API Compliance Checker. If 'force' is true, will re-download even if the + directory exists. + """ + acc_dir = get_java_acc_dir() + if os.path.exists(acc_dir): + logging.info("Java JAVA_ACC is already downloaded.") + if not force: + return + logging.info("Forcing re-download.") + shutil.rmtree(acc_dir) + logging.info("Checking out Java JAVA_ACC...") + subprocess.check_call(["git", "clone", "-b", "2.1", "--single-branch", "--depth=1", JAVA_ACC_GIT_URL, acc_dir]) + + +def find_client_jars(path): + """ Return a list of jars within 'path' to be checked for compatibility. """ + return check_output(["find", path, "-name", "zookeeper*.jar"]).rstrip('\n') + + +def run_java_acc(src_name, src, dst_name, dst): + """ Run the compliance checker to compare 'src' and 'dst'. """ + src_jar = find_client_jars(src) + dst_jar = find_client_jars(dst) + logging.info("Will check compatibility between original jars:\n%s\n" + + "and new jars:\n%s", + src_jar, dst_jar) + + annotations_path = os.path.join(get_scratch_dir(), "annotations.txt") + with file(annotations_path, "w") as f: + for ann in PUBLIC_ANNOTATIONS: + print >>f, ann + + java_acc_path = os.path.join(get_java_acc_dir(), "japi-compliance-checker.pl") + + out_path = os.path.join(get_scratch_dir(), "report.html") + subprocess.check_call(["perl", java_acc_path, + "-lib", "ZooKeeper", + "-v1", src_name, + "-v2", dst_name, + "-d1", src_jar, + "-d2", dst_jar, + "-annotations-list", annotations_path, + "-report-path", out_path]) + + +def main(argv): + logging.basicConfig(level=logging.INFO) + parser = optparse.OptionParser( + usage="usage: %prog SRC..[DST]") + parser.add_option("-f", "--force-download", dest="force_download_deps", + help=("Download dependencies (i.e. Java JAVA_ACC) even if they are " + + "already present")) + opts, args = parser.parse_args() + + if len(args) != 1: + parser.error("no src/dst revision specified") + sys.exit(1) + + src_rev, dst_rev = args[0].split("..", 1) + if dst_rev == "": + dst_rev = "HEAD" + src_rev = get_git_hash(src_rev) + dst_rev = get_git_hash(dst_rev) + + logging.info("Source revision: %s", src_rev) + logging.info("Destination revision: %s", dst_rev) + + # Download deps. + checkout_java_acc(opts.force_download_deps) + + # Set up the build. + scratch_dir = get_scratch_dir() + clean_scratch_dir(scratch_dir) + + # Check out the src and dst source trees. + src_dir = os.path.join(scratch_dir, "src") + dst_dir = os.path.join(scratch_dir, "dst") + checkout_tree(src_rev, src_dir) + checkout_tree(dst_rev, dst_dir) + + # Run the build in each. + build_tree(src_dir) + build_tree(dst_dir) + + run_java_acc(src_rev, src_dir + "/build", + dst_rev, dst_dir + "/build") + + +if __name__ == "__main__": + main(sys.argv) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/checkstyle-noframes-sorted.xsl ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/checkstyle-noframes-sorted.xsl b/zookeeper-server/src/test/resources/checkstyle-noframes-sorted.xsl new file mode 100644 index 0000000..5f9e93b --- /dev/null +++ b/zookeeper-server/src/test/resources/checkstyle-noframes-sorted.xsl @@ -0,0 +1,178 @@ +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +<xsl:output method="html" indent="yes"/> +<xsl:decimal-format decimal-separator="." grouping-separator="," /> + +<xsl:key name="files" match="file" use="@name" /> + +<!-- Checkstyle XML Style Sheet by Stephane Bailliez <sbaill...@apache.org> --> +<!-- Part of the Checkstyle distribution found at http://checkstyle.sourceforge.net --> +<!-- Usage (generates checkstyle_report.html): --> +<!-- <checkstyle failonviolation="false" config="${check.config}"> --> +<!-- <fileset dir="${src.dir}" includes="**/*.java"/> --> +<!-- <formatter type="xml" toFile="${doc.dir}/checkstyle_report.xml"/> --> +<!-- </checkstyle> --> +<!-- <style basedir="${doc.dir}" destdir="${doc.dir}" --> +<!-- includes="checkstyle_report.xml" --> +<!-- style="${doc.dir}/checkstyle-noframes-sorted.xsl"/> --> + +<xsl:template match="checkstyle"> + <html> + <head> + <style type="text/css"> + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + </style> + </head> + <body> + <a name="top"></a> + <!-- jakarta logo --> + <table border="0" cellpadding="0" cellspacing="0" width="100%"> + <tr> + <td class="bannercell" rowspan="2"> + <!--a href="http://jakarta.apache.org/"> + <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/> + </a--> + </td> + <td class="text-align:right"><h2>CheckStyle Audit</h2></td> + </tr> + <tr> + <td class="text-align:right">Designed for use with <a href='http://checkstyle.sourceforge.net/'>CheckStyle</a> and <a href='http://jakarta.apache.org'>Ant</a>.</td> + </tr> + </table> + <hr size="1"/> + + <!-- Summary part --> + <xsl:apply-templates select="." mode="summary"/> + <hr size="1" width="100%" align="left"/> + + <!-- Package List part --> + <xsl:apply-templates select="." mode="filelist"/> + <hr size="1" width="100%" align="left"/> + + <!-- For each package create its part --> + <xsl:apply-templates select="file[@name and generate-id(.) = generate-id(key('files', @name))]" /> + + <hr size="1" width="100%" align="left"/> + + + </body> + </html> +</xsl:template> + + + + <xsl:template match="checkstyle" mode="filelist"> + <h3>Files</h3> + <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> + <tr> + <th>Name</th> + <th>Errors</th> + </tr> + <xsl:for-each select="file[@name and generate-id(.) = generate-id(key('files', @name))]"> + <xsl:sort data-type="number" order="descending" select="count(key('files', @name)/error)"/> + <xsl:variable name="errorCount" select="count(error)"/> + <tr> + <xsl:call-template name="alternated-row"/> + <td><a href="#f-{@name}"><xsl:value-of select="@name"/></a></td> + <td><xsl:value-of select="$errorCount"/></td> + </tr> + </xsl:for-each> + </table> + </xsl:template> + + + <xsl:template match="file"> + <a name="f-{@name}"></a> + <h3>File <xsl:value-of select="@name"/></h3> + + <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> + <tr> + <th>Error Description</th> + <th>Line</th> + </tr> + <xsl:for-each select="key('files', @name)/error"> + <xsl:sort data-type="number" order="ascending" select="@line"/> + <tr> + <xsl:call-template name="alternated-row"/> + <td><xsl:value-of select="@message"/></td> + <td><xsl:value-of select="@line"/></td> + </tr> + </xsl:for-each> + </table> + <a href="#top">Back to top</a> + </xsl:template> + + + <xsl:template match="checkstyle" mode="summary"> + <h3>Summary</h3> + <xsl:variable name="fileCount" select="count(file[@name and generate-id(.) = generate-id(key('files', @name))])"/> + <xsl:variable name="errorCount" select="count(file/error)"/> + <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%"> + <tr> + <th>Files</th> + <th>Errors</th> + </tr> + <tr> + <xsl:call-template name="alternated-row"/> + <td><xsl:value-of select="$fileCount"/></td> + <td><xsl:value-of select="$errorCount"/></td> + </tr> + </table> + </xsl:template> + + <xsl:template name="alternated-row"> + <xsl:attribute name="class"> + <xsl:if test="position() mod 2 = 1">a</xsl:if> + <xsl:if test="position() mod 2 = 0">b</xsl:if> + </xsl:attribute> + </xsl:template> +</xsl:stylesheet> + + http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/checkstyle.xml ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/checkstyle.xml b/zookeeper-server/src/test/resources/checkstyle.xml new file mode 100644 index 0000000..a5d5182 --- /dev/null +++ b/zookeeper-server/src/test/resources/checkstyle.xml @@ -0,0 +1,187 @@ +<?xml version="1.0"?> +<!DOCTYPE module PUBLIC + "-//Puppy Crawl//DTD Check Configuration 1.2//EN" + "http://www.puppycrawl.com/dtds/configuration_1_2.dtd"> + +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<!-- + [Forked from Hadoop@2d7363b27360e36fdd62546c0f9d0b1d78133f29] + + Checkstyle configuration for Zookeeper that is based on the sun_checks.xml file + that is bundled with Checkstyle and includes checks for: + + - the Java Language Specification at + http://java.sun.com/docs/books/jls/second_edition/html/index.html + + - the Sun Code Conventions at http://java.sun.com/docs/codeconv/ + + - the Javadoc guidelines at + http://java.sun.com/j2se/javadoc/writingdoccomments/index.html + + - the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html + + - some best practices + + Checkstyle is very configurable. Be sure to read the documentation at + http://checkstyle.sf.net (or in your downloaded distribution). + + Most Checks are configurable, be sure to consult the documentation. + + To completely disable a check, just comment it out or delete it from the file. + + Finally, it is worth reading the documentation. + +--> + +<module name="Checker"> + + <!-- Checks that a package.html file exists for each package. --> + <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml --> + <module name="JavadocPackage"/> + + <!-- Checks whether files end with a new line. --> + <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile --> + <!-- module name="NewlineAtEndOfFile"/--> + + <!-- Checks that property files contain the same keys. --> + <!-- See http://checkstyle.sf.net/config_misc.html#Translation --> + <module name="Translation"/> + + <module name="FileLength"/> + <module name="FileTabCharacter"/> + + <module name="TreeWalker"> + + <!-- Checks for Javadoc comments. --> + <!-- See http://checkstyle.sf.net/config_javadoc.html --> + <module name="JavadocType"> + <property name="scope" value="public"/> + <property name="allowMissingParamTags" value="true"/> + </module> + <module name="JavadocStyle"/> + + <!-- Checks for Naming Conventions. --> + <!-- See http://checkstyle.sf.net/config_naming.html --> + <module name="ConstantName"/> + <module name="LocalFinalVariableName"/> + <module name="LocalVariableName"/> + <module name="MemberName"/> + <module name="MethodName"/> + <module name="PackageName"/> + <module name="ParameterName"/> + <module name="StaticVariableName"/> + <module name="TypeName"/> + + + <!-- Checks for Headers --> + <!-- See http://checkstyle.sf.net/config_header.html --> + <!-- <module name="Header"> --> + <!-- The follow property value demonstrates the ability --> + <!-- to have access to ANT properties. In this case it uses --> + <!-- the ${basedir} property to allow Checkstyle to be run --> + <!-- from any directory within a project. See property --> + <!-- expansion, --> + <!-- http://checkstyle.sf.net/config.html#properties --> + <!-- <property --> + <!-- name="headerFile" --> + <!-- value="${basedir}/java.header"/> --> + <!-- </module> --> + + <!-- Following interprets the header file as regular expressions. --> + <!-- <module name="RegexpHeader"/> --> + + + <!-- Checks for imports --> + <!-- See http://checkstyle.sf.net/config_import.html --> + <module name="IllegalImport"/> <!-- defaults to sun.* packages --> + <module name="RedundantImport"/> + <module name="UnusedImports"/> + + + <!-- Checks for Size Violations. --> + <!-- See http://checkstyle.sf.net/config_sizes.html --> + <module name="LineLength"> + <property name="ignorePattern" value="^import"/> + </module> + <module name="MethodLength"/> + <module name="ParameterNumber"/> + + + <!-- Checks for whitespace --> + <!-- See http://checkstyle.sf.net/config_whitespace.html --> + <module name="EmptyForIteratorPad"/> + <module name="MethodParamPad"/> + <module name="NoWhitespaceAfter"/> + <module name="NoWhitespaceBefore"/> + <module name="ParenPad"/> + <module name="TypecastParenPad"/> + <module name="WhitespaceAfter"> + <property name="tokens" value="COMMA, SEMI"/> + </module> + + + <!-- Modifier Checks --> + <!-- See http://checkstyle.sf.net/config_modifiers.html --> + <module name="ModifierOrder"/> + <module name="RedundantModifier"/> + + + <!-- Checks for blocks. You know, those {}'s --> + <!-- See http://checkstyle.sf.net/config_blocks.html --> + <module name="AvoidNestedBlocks"/> + <module name="EmptyBlock"/> + <module name="LeftCurly"/> + <module name="NeedBraces"/> + <module name="RightCurly"/> + + + <!-- Checks for common coding problems --> + <!-- See http://checkstyle.sf.net/config_coding.html --> + <!-- module name="AvoidInlineConditionals"/--> + <module name="EmptyStatement"/> + <module name="EqualsHashCode"/> + <module name="HiddenField"> + <property name="ignoreConstructorParameter" value="true"/> + </module> + <module name="IllegalInstantiation"/> + <module name="InnerAssignment"/> + <module name="MissingSwitchDefault"/> + <module name="SimplifyBooleanExpression"/> + <module name="SimplifyBooleanReturn"/> + + <!-- Checks for class design --> + <!-- See http://checkstyle.sf.net/config_design.html --> + <module name="FinalClass"/> + <module name="HideUtilityClassConstructor"/> + <module name="InterfaceIsType"/> + <module name="VisibilityModifier"/> + + + <!-- Miscellaneous other checks. --> + <!-- See http://checkstyle.sf.net/config_misc.html --> + <module name="ArrayTypeStyle"/> + <module name="Indentation"> + <property name="basicOffset" value="4" /> + <property name="caseIndent" value="0" /> + </module> + <module name="TodoComment"/> + <module name="UpperEll"/> + + </module> + +</module> http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/buffersize/create/version-2/log.1 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/buffersize/create/version-2/log.1 b/zookeeper-server/src/test/resources/data/buffersize/create/version-2/log.1 new file mode 100644 index 0000000..4f05bc1 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/buffersize/create/version-2/log.1 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/buffersize/create/version-2/snapshot.0 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/buffersize/create/version-2/snapshot.0 b/zookeeper-server/src/test/resources/data/buffersize/create/version-2/snapshot.0 new file mode 100644 index 0000000..49b512e Binary files /dev/null and b/zookeeper-server/src/test/resources/data/buffersize/create/version-2/snapshot.0 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/buffersize/set/version-2/log.1 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/buffersize/set/version-2/log.1 b/zookeeper-server/src/test/resources/data/buffersize/set/version-2/log.1 new file mode 100644 index 0000000..8586f16 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/buffersize/set/version-2/log.1 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/buffersize/set/version-2/snapshot.0 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/buffersize/set/version-2/snapshot.0 b/zookeeper-server/src/test/resources/data/buffersize/set/version-2/snapshot.0 new file mode 100644 index 0000000..49b512e Binary files /dev/null and b/zookeeper-server/src/test/resources/data/buffersize/set/version-2/snapshot.0 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/log.1 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/log.1 b/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/log.1 new file mode 100644 index 0000000..2f145a6 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/log.1 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.0 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.0 b/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.0 new file mode 100644 index 0000000..49b512e Binary files /dev/null and b/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.0 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.2 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.2 b/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.2 new file mode 100644 index 0000000..59dfa70 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/buffersize/snapshot/version-2/snapshot.2 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.1 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.1 b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.1 new file mode 100644 index 0000000..9dc15ae Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.1 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.274 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.274 b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.274 new file mode 100644 index 0000000..3bb868e Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.274 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.42 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.42 b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.42 new file mode 100644 index 0000000..5385be5 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.42 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.63b ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.63b b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.63b new file mode 100644 index 0000000..4ee0a98 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/log.63b differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.0 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.0 b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.0 new file mode 100644 index 0000000..49b512e Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.0 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.272 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.272 b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.272 new file mode 100644 index 0000000..71f32a5 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.272 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.273 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.273 b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.273 new file mode 100644 index 0000000..3146f56 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.273 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.639 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.639 b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.639 new file mode 100644 index 0000000..cf9e389 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.639 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.83f ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.83f b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.83f new file mode 100644 index 0000000..26dc5f6 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/invalidsnap/version-2/snapshot.83f differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/kerberos/minikdc-krb5.conf ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/kerberos/minikdc-krb5.conf b/zookeeper-server/src/test/resources/data/kerberos/minikdc-krb5.conf new file mode 100644 index 0000000..43ec7c4 --- /dev/null +++ b/zookeeper-server/src/test/resources/data/kerberos/minikdc-krb5.conf @@ -0,0 +1,30 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This resource is originally from HDFS, see the similarly named files there +# in case of bug fixing, history, etc. +# Branch : trunk +# Github Revision: 1d1ab587e4e92ce3aea4cb144811f69145cb3b33 +# +[libdefaults] + default_realm = {0} + udp_preference_limit = 1 + +[realms] + {0} = '{' + kdc = {1}:{2} + '}' \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/kerberos/minikdc.ldiff ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/kerberos/minikdc.ldiff b/zookeeper-server/src/test/resources/data/kerberos/minikdc.ldiff new file mode 100644 index 0000000..20c8d77 --- /dev/null +++ b/zookeeper-server/src/test/resources/data/kerberos/minikdc.ldiff @@ -0,0 +1,52 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This resource is originally from HDFS, see the similarly named files there +# in case of bug fixing, history, etc. +# Branch : trunk +# Github Revision: 1d1ab587e4e92ce3aea4cb144811f69145cb3b33 +# +dn: ou=users,dc=${0},dc=${1} +objectClass: organizationalUnit +objectClass: top +ou: users + +dn: uid=krbtgt,ou=users,dc=${0},dc=${1} +objectClass: top +objectClass: person +objectClass: inetOrgPerson +objectClass: krb5principal +objectClass: krb5kdcentry +cn: KDC Service +sn: Service +uid: krbtgt +userPassword: secret +krb5PrincipalName: krbtgt/${2}.${3}@${2}.${3} +krb5KeyVersionNumber: 0 + +dn: uid=ldap,ou=users,dc=${0},dc=${1} +objectClass: top +objectClass: person +objectClass: inetOrgPerson +objectClass: krb5principal +objectClass: krb5kdcentry +cn: LDAP +sn: Service +uid: ldap +userPassword: secret +krb5PrincipalName: ldap/${4}@${2}.${3} +krb5KeyVersionNumber: 0 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/upgrade/log.100000001 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/upgrade/log.100000001 b/zookeeper-server/src/test/resources/data/upgrade/log.100000001 new file mode 100644 index 0000000..00655f1 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/upgrade/log.100000001 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/upgrade/log.100001bf0 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/upgrade/log.100001bf0 b/zookeeper-server/src/test/resources/data/upgrade/log.100001bf0 new file mode 100644 index 0000000..83fa697 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/upgrade/log.100001bf0 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/upgrade/snapshot.100000000 ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/upgrade/snapshot.100000000 b/zookeeper-server/src/test/resources/data/upgrade/snapshot.100000000 new file mode 100644 index 0000000..56f9015 Binary files /dev/null and b/zookeeper-server/src/test/resources/data/upgrade/snapshot.100000000 differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/data/upgrade/snapshot.100001bec ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/data/upgrade/snapshot.100001bec b/zookeeper-server/src/test/resources/data/upgrade/snapshot.100001bec new file mode 100644 index 0000000..0010d1e Binary files /dev/null and b/zookeeper-server/src/test/resources/data/upgrade/snapshot.100001bec differ http://git-wip-us.apache.org/repos/asf/zookeeper/blob/7291e47c/zookeeper-server/src/test/resources/findbugsExcludeFile.xml ---------------------------------------------------------------------- diff --git a/zookeeper-server/src/test/resources/findbugsExcludeFile.xml b/zookeeper-server/src/test/resources/findbugsExcludeFile.xml new file mode 100644 index 0000000..c023f4f --- /dev/null +++ b/zookeeper-server/src/test/resources/findbugsExcludeFile.xml @@ -0,0 +1,166 @@ +<FindBugsFilter> + <!-- Allow command line utilities, which follow pattern *Main.java, to call + system exit --> + <Match> + <Class name="~org\.apache\.zookeeper\..*Main" /> + <Bug pattern="DM_EXIT" /> + </Match> + + <!-- This is too complicated to resolve/ingrained into the architecture + In particular we want to make sure we exit if this occurs + Also notice logged as fatal error --> + <Match> + <Class name="org.apache.zookeeper.server.ZooKeeperCriticalThread" /> + <Method name="handleException" /> + <Bug pattern="DM_EXIT" /> + </Match> + + <!-- In particular we want to make sure we exit if this occurs, unrecoverable. + Also notice logged as fatal error --> + <Match> + <Class name="org.apache.zookeeper.server.ZooKeeperServer" /> + <Method name="takeSnapshot" /> + <Bug pattern="DM_EXIT" /> + </Match> + + + <!-- We want to catch all exceptions and cleanup, regardless of source + (incl runtime) --> + <Match> + <Class name="org.apache.zookeeper.ClientCnxn$SendThread" /> + <Method name="run" /> + <Bug pattern="REC_CATCH_EXCEPTION" /> + </Match> + + <!-- If we cannot open a socket to elect a leader, then we should + simply exit --> + <Match> + <Class name="org.apache.zookeeper.server.quorum.LeaderElection" /> + <Method name="lookForLeader" /> + <Bug pattern="DM_EXIT" /> + </Match> + + <!-- Committing out of order is an unrecoverable error, so we should + really exit --> + <Match> + <Class name="org.apache.zookeeper.server.quorum.FollowerZooKeeperServer" /> + <Method name="commit" /> + <Bug pattern="DM_EXIT" /> + </Match> + + <!-- Two unrecoverable errors while following the leader --> + <Match> + <Class name="org.apache.zookeeper.server.quorum.Learner" /> + <Method name="syncWithLeader" /> + <Bug pattern="DM_EXIT" /> + </Match> + + <Match> + <Package name="org.apache.jute.compiler.generated" /> + </Match> + + <Match> + <Package name="~org\.apache\.zookeeper\.(proto|data|txn)" /> + <Bug code="EI, EI2" /> + </Match> + + <Match> + <Class name="org.apache.zookeeper.server.DataNode" /> + <Bug code="EI2"/> + </Match> + + <Match> + <Class name="org.apache.zookeeper.server.quorum.QuorumPacket" /> + <Bug code="EI2, EI" /> + </Match> + + <Match> + <Class name="org.apache.zookeeper.server.quorum.QuorumAuthPacket" /> + <Bug code="EI2, EI" /> + </Match> + + <Match> + <Class name="org.apache.zookeeper.ClientCnxn"/> + <Bug code="EI, EI2" /> + </Match> + + <Match> + <Class name="org.apache.zookeeper.server.DataNode"/> + <Field name="children"/> + <Bug code="IS"/> + </Match> + <Match> + <Class name="org.apache.zookeeper.server.quorum.Leader"/> + <Field name="lastProposed"/> + <Bug code="IS"/> + </Match> + <Match> + <Class name="org.apache.zookeeper.server.persistence.FileTxnLog"/> + <Field name="serverStats"/> + <Bug code="IS"/> + </Match> + <Match> + <Class name="org.apache.zookeeper.server.quorum.LearnerSessionTracker"/> + <Bug code="UrF"/> + </Match> + <Match> + <Class name="org.apache.zookeeper.server.quorum.AuthFastLeaderElection$Messenger$WorkerSender"/> + <Method name="process"/> + <Bug code="RV,SF"/> + </Match> + <Match> + <Class name="org.apache.zookeeper.server.quorum.AuthFastLeaderElection$Messenger$WorkerReceiver"/> + <Method name="run"/> + <Bug code="SF"/> + </Match> + + <!-- these are old classes just for upgrading and should go away --> + <Match> + <Class name="org.apache.zookeeper.server.quorum.AuthFastLeaderElection"/> + </Match> + <Match> + <Class name="org.apache.zookeeper.server.upgrade.DataNodeV1"/> + </Match> + + <Match> + <Class name="org.apache.zookeeper.server.upgrade.DataTreeV1"/> + </Match> + + <!-- References code in a generated file that may or maynot be null --> + <Match> + <Class name="org.apache.zookeeper.Version" /> + <Method name="getVersion" /> + <Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE" /> + </Match> + + <!-- sync'd object is also being used to protect the isrunning flag, this is ok --> + <Match> + <Class name="org.apache.zookeeper.ClientCnxn$EventThread"/> + <Bug code="JLM"/> + <Or> + <Method name="queuePacket" /> + <Method name="run" /> + </Or> + </Match> + + <Match> + <Class name="org.apache.zookeeper.server.quorum.QuorumPeer"/> + <Bug pattern="OS_OPEN_STREAM" /> + <Method name="writeLongToFile" /> + </Match> + + <!-- Disable 'Malicious code vulnerability warnings' due to mutable collection types in interface. + Undo this when ZOOKEEPER-1362 is done. --> + <Match> + <Class name="org.apache.zookeeper.ZooDefs$Ids"/> + <Bug pattern="MS_MUTABLE_COLLECTION" /> + </Match> + + <!-- Disable 'Found reliance on default encoding in' warnings. Ideally this should be fixed + by fixing the underlying cause - reliance on 'default' encoding in IO operations. + Please see ZOOKEEPER-1976 for detailed discussion. --> + <Match> + <Bug pattern="DM_DEFAULT_ENCODING" /> + </Match> + +</FindBugsFilter>