|
@@ -23,12 +23,16 @@ import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
import org.apache.log4j.Logger;
|
|
|
+import org.apache.zookeeper.AsyncCallback;
|
|
|
import org.apache.zookeeper.CreateMode;
|
|
|
import org.apache.zookeeper.KeeperException;
|
|
|
import org.apache.zookeeper.WatchedEvent;
|
|
|
import org.apache.zookeeper.Watcher;
|
|
|
import org.apache.zookeeper.ZooDefs;
|
|
|
import org.apache.zookeeper.ZooKeeper;
|
|
|
+import org.apache.zookeeper.data.Stat;
|
|
|
+import org.apache.zookeeper.server.quorum.FollowerHandler;
|
|
|
+import org.apache.zookeeper.server.quorum.Leader;
|
|
|
import org.apache.zookeeper.ZooDefs.Ids;
|
|
|
import org.junit.Before;
|
|
|
import org.junit.Test;
|
|
@@ -93,6 +97,42 @@ public class QuorumTest extends QuorumBase {
|
|
|
{
|
|
|
ct.testClientWithWatcherObj();
|
|
|
}
|
|
|
+ volatile int counter = 0;
|
|
|
+ volatile int errors = 0;
|
|
|
+ @Test
|
|
|
+ public void testLeaderShutdown() throws IOException, InterruptedException, KeeperException {
|
|
|
+ ZooKeeper zk = new DisconnectableZooKeeper(qb.hostPort, ClientBase.CONNECTION_TIMEOUT, new Watcher() {
|
|
|
+ public void process(WatchedEvent event) {
|
|
|
+ }});
|
|
|
+ zk.create("/blah", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
|
|
|
+ zk.create("/blah/blah", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
|
|
|
+ Leader leader = qb.s1.leader;
|
|
|
+ if (leader == null) leader = qb.s2.leader;
|
|
|
+ if (leader == null) leader = qb.s3.leader;
|
|
|
+ if (leader == null) leader = qb.s4.leader;
|
|
|
+ if (leader == null) leader = qb.s5.leader;
|
|
|
+ assertNotNull(leader);
|
|
|
+ for(int i = 0; i < 10000; i++) {
|
|
|
+ zk.setData("/blah/blah", new byte[0], -1, new AsyncCallback.StatCallback() {
|
|
|
+ public void processResult(int rc, String path, Object ctx,
|
|
|
+ Stat stat) {
|
|
|
+ counter++;
|
|
|
+ if (rc != 0) {
|
|
|
+ errors++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, null);
|
|
|
+ }
|
|
|
+ ArrayList<FollowerHandler> fhs = new ArrayList<FollowerHandler>(leader.forwardingFollowers);
|
|
|
+ for(FollowerHandler f: fhs) {
|
|
|
+ f.sock.shutdownInput();
|
|
|
+ }
|
|
|
+ while(counter + errors < 10000) {
|
|
|
+ Thread.sleep(200);
|
|
|
+ }
|
|
|
+ assertTrue("We should have had some errors", errors != 0);
|
|
|
+ zk.close();
|
|
|
+ }
|
|
|
@Test
|
|
|
public void testMultipleWatcherObjs() throws IOException,
|
|
|
InterruptedException, KeeperException
|