You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ra...@apache.org on 2015/07/05 06:07:44 UTC
svn commit: r1689212 - in /zookeeper/branches/branch-3.5: CHANGES.txt
src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java
src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
Author: rakeshr
Date: Sun Jul 5 04:07:44 2015
New Revision: 1689212
URL: http://svn.apache.org/r1689212
Log:
ZOOKEEPER-2224: Four letter command hangs when network is slow (Arshad Mohammad via rakeshr)
Modified:
zookeeper/branches/branch-3.5/CHANGES.txt
zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java
zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
Modified: zookeeper/branches/branch-3.5/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/CHANGES.txt?rev=1689212&r1=1689211&r2=1689212&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/CHANGES.txt (original)
+++ zookeeper/branches/branch-3.5/CHANGES.txt Sun Jul 5 04:07:44 2015
@@ -140,6 +140,9 @@ BUGFIXES:
ZOOKEEPER-2221: Zookeeper JettyAdminServer server should start on configured IP
(Surendra Singh Lilhore via rgs)
+ ZOOKEEPER-2224: Four letter command hangs when network is slow
+ (Arshad Mohammad via rakeshr)
+
IMPROVEMENTS:
ZOOKEEPER-1660 Documentation for Dynamic Reconfiguration (Reed Wanderman-Milne via shralex)
Modified: zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java?rev=1689212&r1=1689211&r2=1689212&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java (original)
+++ zookeeper/branches/branch-3.5/src/java/main/org/apache/zookeeper/client/FourLetterWordMain.java Sun Jul 5 04:07:44 2015
@@ -22,7 +22,10 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
import java.net.Socket;
+import java.net.SocketTimeoutException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
@@ -33,6 +36,8 @@ import org.apache.zookeeper.common.X509E
import org.apache.zookeeper.common.X509Util;
public class FourLetterWordMain {
+ //in milliseconds, socket should connect/read within this period otherwise SocketTimeoutException
+ private static final int DEFAULT_SOCKET_TIMEOUT = 5000;
protected static final Logger LOG = Logger.getLogger(FourLetterWordMain.class);
/**
* Send the 4letterword
@@ -45,7 +50,7 @@ public class FourLetterWordMain {
*/
public static String send4LetterWord(String host, int port, String cmd)
throws IOException, SSLContextException {
- return send4LetterWord(host, port, cmd, false);
+ return send4LetterWord(host, port, cmd, false, DEFAULT_SOCKET_TIMEOUT);
}
/**
@@ -60,20 +65,39 @@ public class FourLetterWordMain {
*/
public static String send4LetterWord(String host, int port, String cmd, boolean secure)
throws IOException, SSLContextException {
+ return send4LetterWord(host, port, cmd, secure, DEFAULT_SOCKET_TIMEOUT);
+ }
+
+ /**
+ * Send the 4letterword
+ * @param host the destination host
+ * @param port the destination port
+ * @param cmd the 4letterword
+ * @param secure whether to use SSL
+ * @param timeout in milliseconds, maximum time to wait while connecting/reading data
+ * @return server response
+ * @throws java.io.IOException
+ * @throws SSLContextException
+ */
+ public static String send4LetterWord(String host, int port, String cmd, boolean secure, int timeout)
+ throws IOException, SSLContextException {
LOG.info("connecting to " + host + " " + port);
Socket sock;
-
+ InetSocketAddress hostaddress= host != null ? new InetSocketAddress(host, port) :
+ new InetSocketAddress(InetAddress.getByName(null), port);
if (secure) {
LOG.info("using secure socket");
SSLContext sslContext = X509Util.createSSLContext();
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
- SSLSocket sslSock = (SSLSocket) socketFactory.createSocket(host, port);
+ SSLSocket sslSock = (SSLSocket) socketFactory.createSocket();
+ sslSock.connect(hostaddress, timeout);
sslSock.startHandshake();
sock = sslSock;
} else {
- sock = new Socket(host, port);
+ sock = new Socket();
+ sock.connect(hostaddress, timeout);
}
-
+ sock.setSoTimeout(timeout);
BufferedReader reader = null;
try {
OutputStream outstream = sock.getOutputStream();
@@ -95,6 +119,8 @@ public class FourLetterWordMain {
sb.append(line + "\n");
}
return sb.toString();
+ } catch (SocketTimeoutException e) {
+ throw new IOException("Exception while executing four letter word: " + cmd, e);
} finally {
sock.close();
if (reader != null) {
Modified: zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java?rev=1689212&r1=1689211&r2=1689212&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java (original)
+++ zookeeper/branches/branch-3.5/src/java/test/org/apache/zookeeper/test/FourLetterWordsTest.java Sun Jul 5 04:07:44 2015
@@ -108,6 +108,10 @@ public class FourLetterWordsTest extends
HostPort hpobj = ClientBase.parseHostPortList(hostPort).get(0);
return send4LetterWord(hpobj.host, hpobj.port, cmd);
}
+ private String sendRequest(String cmd, int timeout) throws IOException, SSLContextException {
+ HostPort hpobj = ClientBase.parseHostPortList(hostPort).get(0);
+ return send4LetterWord(hpobj.host, hpobj.port, cmd, false, timeout);
+ }
private void verify(String cmd, String expected) throws IOException, SSLContextException {
String resp = sendRequest(cmd);
@@ -116,7 +120,7 @@ public class FourLetterWordsTest extends
}
@Test
- public void validateStatOutput() throws Exception {
+ public void testValidateStatOutput() throws Exception {
ZooKeeper zk1 = createClient();
ZooKeeper zk2 = createClient();
@@ -159,7 +163,7 @@ public class FourLetterWordsTest extends
}
@Test
- public void validateConsOutput() throws Exception {
+ public void testValidateConsOutput() throws Exception {
ZooKeeper zk1 = createClient();
ZooKeeper zk2 = createClient();
@@ -178,4 +182,14 @@ public class FourLetterWordsTest extends
zk1.close();
zk2.close();
}
+
+ @Test(timeout=60000)
+ public void testValidateSocketTimeout() throws Exception {
+ /**
+ * testing positive scenario that even with timeout parameter the
+ * functionality works fine
+ */
+ String resp = sendRequest("isro", 2000);
+ Assert.assertTrue(resp.contains("rw"));
+ }
}