You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ma...@apache.org on 2013/09/18 04:08:33 UTC
svn commit: r1524275 - in /zookeeper/trunk: CHANGES.txt
src/java/main/org/apache/zookeeper/ClientCnxn.java
Author: mahadev
Date: Wed Sep 18 02:08:33 2013
New Revision: 1524275
URL: http://svn.apache.org/r1524275
Log:
ZOOKEEPER-1751. ClientCnxn#run could miss the second ping or connection get dropped before a ping. (Jeffrey Zhong via mahadev)
Modified:
zookeeper/trunk/CHANGES.txt
zookeeper/trunk/src/java/main/org/apache/zookeeper/ClientCnxn.java
Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1524275&r1=1524274&r2=1524275&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Wed Sep 18 02:08:33 2013
@@ -377,7 +377,10 @@ BUGFIXES:
ZOOKEEPER-1664. Kerberos auth doesn't work with native platform GSS integration. (Boaz Kelmer via camille)
ZOOKEEPER-1754. Read-only server allows to create znode (Rakesh R via fpj)
-
+
+ ZOOKEEPER-1751. ClientCnxn#run could miss the second ping or connection get
+ dropped before a ping. (Jeffrey Zhong via mahadev)
+
IMPROVEMENTS:
ZOOKEEPER-1170. Fix compiler (eclipse) warnings: unused imports,
Modified: zookeeper/trunk/src/java/main/org/apache/zookeeper/ClientCnxn.java
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/java/main/org/apache/zookeeper/ClientCnxn.java?rev=1524275&r1=1524274&r2=1524275&view=diff
==============================================================================
--- zookeeper/trunk/src/java/main/org/apache/zookeeper/ClientCnxn.java (original)
+++ zookeeper/trunk/src/java/main/org/apache/zookeeper/ClientCnxn.java Wed Sep 18 02:08:33 2013
@@ -1016,6 +1016,7 @@ public class ClientCnxn {
clientCnxnSocket.updateLastSendAndHeard();
int to;
long lastPingRwServer = System.currentTimeMillis();
+ final int MAX_SEND_PING_INTERVAL = 10000; //10 seconds
while (state.isAlive()) {
try {
if (!clientCnxnSocket.isConnected()) {
@@ -1072,9 +1073,12 @@ public class ClientCnxn {
+ Long.toHexString(sessionId));
}
if (state.isConnected()) {
- int timeToNextPing = readTimeout / 2
- - clientCnxnSocket.getIdleSend();
- if (timeToNextPing <= 0) {
+ //1000(1 second) is to prevent race condition missing to send the second ping
+ //also make sure not to send too many pings when readTimeout is small
+ int timeToNextPing = readTimeout / 2 - clientCnxnSocket.getIdleSend() -
+ ((clientCnxnSocket.getIdleSend() > 1000) ? 1000 : 0);
+ //send a ping request either time is due or no packet sent out within MAX_SEND_PING_INTERVAL
+ if (timeToNextPing <= 0 || clientCnxnSocket.getIdleSend() > MAX_SEND_PING_INTERVAL) {
sendPing();
clientCnxnSocket.updateLastSend();
} else {