You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by fp...@apache.org on 2013/05/11 15:32:38 UTC
svn commit: r1481322 - in /zookeeper/branches/branch-3.4: CHANGES.txt
src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java
src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
Author: fpj
Date: Sat May 11 13:32:38 2013
New Revision: 1481322
URL: http://svn.apache.org/r1481322
Log:
ZOOKEEPER-1697: large snapshots can cause continuous quorum failure
(phunt via fpj)
Modified:
zookeeper/branches/branch-3.4/CHANGES.txt
zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java
zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
Modified: zookeeper/branches/branch-3.4/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.4/CHANGES.txt?rev=1481322&r1=1481321&r2=1481322&view=diff
==============================================================================
--- zookeeper/branches/branch-3.4/CHANGES.txt (original)
+++ zookeeper/branches/branch-3.4/CHANGES.txt Sat May 11 13:32:38 2013
@@ -60,6 +60,9 @@ BUGFIXES:
ZOOKEEPER-1633. Introduce a protocol version to connection initiation
message (Alexander Shraer via michim)
+ ZOOKEEPER-1697: large snapshots can cause continuous quorum failure
+ (phunt via fpj)
+
IMPROVEMENTS:
ZOOKEEPER-1564. Allow JUnit test build with IBM Java
Modified: zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java?rev=1481322&r1=1481321&r2=1481322&view=diff
==============================================================================
--- zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java (original)
+++ zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/LearnerHandler.java Sat May 11 13:32:38 2013
@@ -64,7 +64,11 @@ public class LearnerHandler extends Thre
final Leader leader;
- long tickOfLastAck;
+ /** Deadline for receiving the next ack. If we are bootstrapping then
+ * it's based on the initLimit, if we are done bootstrapping it's based
+ * on the syncLimit. Once the deadline is past this learner should
+ * be considered no longer "sync'd" with the leader. */
+ volatile long tickOfNextAckDeadline;
/**
* ZooKeeper server identifier of this learner
@@ -104,7 +108,7 @@ public class LearnerHandler extends Thre
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("LearnerHandler ").append(sock);
- sb.append(" tickOfLastAck:").append(tickOfLastAck());
+ sb.append(" tickOfNextAckDeadline:").append(tickOfNextAckDeadline());
sb.append(" synced?:").append(synced());
sb.append(" queuedPacketLength:").append(queuedPackets.size());
return sb.toString();
@@ -232,7 +236,10 @@ public class LearnerHandler extends Thre
*/
@Override
public void run() {
- try {
+ try {
+ tickOfNextAckDeadline = leader.self.tick
+ + leader.self.initLimit + leader.self.syncLimit;
+
ia = BinaryInputArchive.getArchive(new BufferedInputStream(sock
.getInputStream()));
bufferedOutput = new BufferedOutputStream(sock.getOutputStream());
@@ -452,6 +459,7 @@ public class LearnerHandler extends Thre
LOG.error("Next packet was supposed to be an ACK");
return;
}
+ LOG.info("Received NEWLEADER-ACK message from " + getSid());
leader.waitForNewLeaderAck(getSid(), qp.getZxid(), getLearnerType());
// now that the ack has been processed expect the syncLimit
@@ -482,7 +490,7 @@ public class LearnerHandler extends Thre
if (LOG.isTraceEnabled()) {
ZooTrace.logQuorumPacket(LOG, traceMask, 'i', qp);
}
- tickOfLastAck = leader.self.tick;
+ tickOfNextAckDeadline = leader.self.tick + leader.self.syncLimit;
ByteBuffer bb;
@@ -597,8 +605,8 @@ public class LearnerHandler extends Thre
leader.removeLearnerHandler(this);
}
- public long tickOfLastAck() {
- return tickOfLastAck;
+ public long tickOfNextAckDeadline() {
+ return tickOfNextAckDeadline;
}
/**
@@ -620,6 +628,6 @@ public class LearnerHandler extends Thre
public boolean synced() {
return isAlive()
- && tickOfLastAck >= leader.self.tick - leader.self.syncLimit;
+ && leader.self.tick <= tickOfNextAckDeadline;
}
}
Modified: zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java?rev=1481322&r1=1481321&r2=1481322&view=diff
==============================================================================
--- zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java (original)
+++ zookeeper/branches/branch-3.4/src/java/main/org/apache/zookeeper/server/quorum/QuorumPeer.java Sat May 11 13:32:38 2013
@@ -246,7 +246,7 @@ public class QuorumPeer extends Thread i
/**
* The current tick
*/
- protected int tick;
+ protected volatile int tick;
/**
* @deprecated As of release 3.4.0, this class has been deprecated, since