Author: mahadev
Date: Wed May 5 20:32:33 2010
New Revision: 941473
URL: http://svn.apache.org/viewvc?rev=941473&view=rev
Log:
ZOOKEEPER-764. Observer elected leader due to inconsistent voting view (henry via mahadev)
Modified:
hadoop/zookeeper/trunk/CHANGES.txt
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncHammerTest.java
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LENonTerminateTest.java
hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumBase.java
Modified: hadoop/zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/CHANGES.txt?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/CHANGES.txt (original)
+++ hadoop/zookeeper/trunk/CHANGES.txt Wed May 5 20:32:33 2010
@@ -46,6 +46,9 @@ BUGFIXES:
ZOOKEEPER-737. some 4 letter words may fail with netcat (nc). (mahadev)
+ ZOOKEEPER-764. Observer elected leader due to inconsistent voting view
+ (henry via mahadev)
+
IMPROVEMENTS:
ZOOKEEPER-724. Improve junit test integration - log harness information
(phunt via mahadev)
Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java
(original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/FastLeaderElection.java
Wed May 5 20:32:33 2010
@@ -587,7 +587,7 @@ public class FastLeaderElection implemen
* @return ServerState
*/
private ServerState learningState(){
- if(self.getPeerType() == LearnerType.PARTICIPANT){
+ if(self.getLearnerType() == LearnerType.PARTICIPANT){
LOG.debug("I'm a participant: " + self.getId());
return ServerState.FOLLOWING;
}
@@ -603,7 +603,7 @@ public class FastLeaderElection implemen
* @return long
*/
private long getInitId(){
- if(self.getPeerType() == LearnerType.PARTICIPANT)
+ if(self.getLearnerType() == LearnerType.PARTICIPANT)
return self.getId();
else return Long.MIN_VALUE;
}
@@ -614,7 +614,7 @@ public class FastLeaderElection implemen
* @return long
*/
private long getInitLastLoggedZxid(){
- if(self.getPeerType() == LearnerType.PARTICIPANT)
+ if(self.getLearnerType() == LearnerType.PARTICIPANT)
return self.getLastLoggedZxid();
else return Long.MIN_VALUE;
}
Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java
(original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/LeaderElection.java
Wed May 5 20:32:33 2010
@@ -226,7 +226,7 @@ public class LeaderElection implements E
self.setCurrentVote(result.winner);
s.close();
Vote current = self.getCurrentVote();
- LOG.info("Found leader: my type is: " + self.getPeerType());
+ LOG.info("Found leader: my type is: " + self.getLearnerType());
/*
* We want to make sure we implement the state machine
* correctly. If we are a PARTICIPANT, once a leader
@@ -234,7 +234,7 @@ public class LeaderElection implements E
* FOLLOWING. However if we are an OBSERVER, it is an
* error to be elected as a Leader.
*/
- if (self.getPeerType() == LearnerType.OBSERVER) {
+ if (self.getLearnerType() == LearnerType.OBSERVER) {
if (current.id == self.getId()) {
// This should never happen!
LOG.error("OBSERVER elected as leader!");
Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
(original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
Wed May 5 20:32:33 2010
@@ -148,14 +148,24 @@ public class QuorumPeer extends Thread i
/*
* Default value of peer is participant
*/
- private LearnerType peerType = LearnerType.PARTICIPANT;
+ private LearnerType learnerType = LearnerType.PARTICIPANT;
- public LearnerType getPeerType() {
- return peerType;
+ public LearnerType getLearnerType() {
+ return learnerType;
}
- public void setPeerType(LearnerType p) {
- peerType = p;
+ /**
+ * Sets the LearnerType both in the QuorumPeer and in the peerMap
+ */
+ public void setLearnerType(LearnerType p) {
+ learnerType = p;
+ if (quorumPeers.containsKey(this.myid)) {
+ this.quorumPeers.get(myid).type = p;
+ } else {
+ LOG.error("Setting LearnerType to " + p + " but " + myid
+ + " not in QuorumPeers. ");
+ }
+
}
/**
* The servers that make up the cluster
Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
(original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeerMain.java
Wed May 5 20:32:33 2010
@@ -138,7 +138,7 @@ public class QuorumPeerMain {
quorumPeer.setQuorumVerifier(config.getQuorumVerifier());
quorumPeer.setCnxnFactory(cnxnFactory);
quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory()));
- quorumPeer.setPeerType(config.getPeerType());
+ quorumPeer.setLearnerType(config.getPeerType());
quorumPeer.start();
quorumPeer.join();
Modified: hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
(original)
+++ hadoop/zookeeper/trunk/src/java/main/org/apache/zookeeper/server/quorum/QuorumZooKeeperServer.java
Wed May 5 20:32:33 2010
@@ -57,6 +57,6 @@ public abstract class QuorumZooKeeperSer
pwriter.print("quorumPort=");
pwriter.println(self.quorumPeers.get(self.getId()).addr.getPort());
pwriter.print("peerType=");
- pwriter.println(self.getPeerType().ordinal());
+ pwriter.println(self.getLearnerType().ordinal());
}
}
Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncHammerTest.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncHammerTest.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncHammerTest.java (original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/AsyncHammerTest.java Wed
May 5 20:32:33 2010
@@ -49,9 +49,8 @@ public class AsyncHammerTest extends ZKT
private volatile boolean bang;
- @Before
- public void setUp() throws Exception {
- qb.setUp();
+ public void setUp(boolean withObservers) throws Exception {
+ qb.setUp(withObservers);
}
protected void restart() throws Exception {
@@ -63,7 +62,6 @@ public class AsyncHammerTest extends ZKT
qb.startServers();
}
- @After
public void tearDown() throws Exception {
LOG.info("Test clients shutting down");
qb.tearDown();
@@ -171,6 +169,7 @@ public class AsyncHammerTest extends ZKT
@Test
public void testHammer() throws Exception {
+ setUp(false);
bang = true;
LOG.info("Starting hammers");
HammerThread[] hammers = new HammerThread[100];
@@ -197,12 +196,12 @@ public class AsyncHammerTest extends ZKT
// after restart
LOG.info("Verifying hammers 2");
qb.verifyRootOfAllServersMatch(qb.hostPort);
+ tearDown();
}
@Test
public void testObserversHammer() throws Exception {
- qb.tearDown();
- qb.setUp(true);
+ setUp(true);
bang = true;
Thread[] hammers = new Thread[100];
for (int i = 0; i < hammers.length; i++) {
@@ -217,6 +216,7 @@ public class AsyncHammerTest extends ZKT
}
// before restart
qb.verifyRootOfAllServersMatch(qb.hostPort);
+ tearDown();
}
@SuppressWarnings("unchecked")
Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java
(original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/HierarchicalQuorumTest.java
Wed May 5 20:32:33 2010
@@ -166,7 +166,7 @@ public class HierarchicalQuorumTest exte
QuorumHierarchical hq4 = new QuorumHierarchical(qp);
s4 = new QuorumPeer(peers, s4dir, s4dir, port4, 3, 4, tickTime, initLimit, syncLimit,
hq4);
if (withObservers) {
- s4.setPeerType(QuorumPeer.LearnerType.OBSERVER);
+ s4.setLearnerType(QuorumPeer.LearnerType.OBSERVER);
}
Assert.assertEquals(port4, s4.getClientPort());
@@ -174,7 +174,7 @@ public class HierarchicalQuorumTest exte
QuorumHierarchical hq5 = new QuorumHierarchical(qp);
s5 = new QuorumPeer(peers, s5dir, s5dir, port5, 3, 5, tickTime, initLimit, syncLimit,
hq5);
if (withObservers) {
- s5.setPeerType(QuorumPeer.LearnerType.OBSERVER);
+ s5.setLearnerType(QuorumPeer.LearnerType.OBSERVER);
}
Assert.assertEquals(port5, s5.getClientPort());
Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LENonTerminateTest.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LENonTerminateTest.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LENonTerminateTest.java
(original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/LENonTerminateTest.java
Wed May 5 20:32:33 2010
@@ -169,7 +169,7 @@ public class LENonTerminateTest extends
self.setCurrentVote(result.winner);
s.close();
Vote current = self.getCurrentVote();
- LOG.info("Found leader: my type is: " + self.getPeerType());
+ LOG.info("Found leader: my type is: " + self.getLearnerType());
/*
* We want to make sure we implement the state machine
* correctly. If we are a PARTICIPANT, once a leader
@@ -177,7 +177,7 @@ public class LENonTerminateTest extends
* FOLLOWING. However if we are an OBSERVER, it is an
* error to be elected as a Leader.
*/
- if (self.getPeerType() == LearnerType.OBSERVER) {
+ if (self.getLearnerType() == LearnerType.OBSERVER) {
if (current.id == self.getId()) {
// This should never happen!
LOG.error("OBSERVER elected as leader!");
Modified: hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumBase.java
URL: http://svn.apache.org/viewvc/hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumBase.java?rev=941473&r1=941472&r2=941473&view=diff
==============================================================================
--- hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumBase.java (original)
+++ hadoop/zookeeper/trunk/src/java/test/org/apache/zookeeper/test/QuorumBase.java Wed May
5 20:32:33 2010
@@ -159,10 +159,16 @@ public class QuorumBase extends ClientBa
Assert.assertEquals(port5, s5.getClientPort());
if (withObservers) {
- s4.setPeerType(LearnerType.OBSERVER);
- s5.setPeerType(LearnerType.OBSERVER);
+ s4.setLearnerType(LearnerType.OBSERVER);
+ s5.setLearnerType(LearnerType.OBSERVER);
}
+ LOG.info("QuorumPeer 1 voting view: " + s1.getVotingView());
+ LOG.info("QuorumPeer 2 voting view: " + s2.getVotingView());
+ LOG.info("QuorumPeer 3 voting view: " + s3.getVotingView());
+ LOG.info("QuorumPeer 4 voting view: " + s4.getVotingView());
+ LOG.info("QuorumPeer 5 voting view: " + s5.getVotingView());
+
LOG.info("start QuorumPeer 1");
s1.start();
LOG.info("start QuorumPeer 2");
|