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"));
+    }
 }