You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by an...@apache.org on 2018/10/24 09:32:18 UTC
[02/36] zookeeper git commit: ZOOKEEPER-3032: MAVEN MIGRATION -
branch-3.4 - zookeeper-server
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 <sb...@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>