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 2016/10/26 02:35:58 UTC

zookeeper git commit: ZOOKEEPER-2442: Socket leak in QuorumCnxManager connectOne (Michael Han via rakeshr)

Repository: zookeeper
Updated Branches:
  refs/heads/branch-3.5 4eeb90dd1 -> 6bd38e3d8


ZOOKEEPER-2442: Socket leak in QuorumCnxManager connectOne
 (Michael Han via rakeshr)


Project: http://git-wip-us.apache.org/repos/asf/zookeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/zookeeper/commit/6bd38e3d
Tree: http://git-wip-us.apache.org/repos/asf/zookeeper/tree/6bd38e3d
Diff: http://git-wip-us.apache.org/repos/asf/zookeeper/diff/6bd38e3d

Branch: refs/heads/branch-3.5
Commit: 6bd38e3d89ecc03285459be3e511d32f487ced0c
Parents: 4eeb90d
Author: Rakesh Radhakrishnan <ra...@apache.org>
Authored: Wed Oct 26 08:02:54 2016 +0530
Committer: Rakesh Radhakrishnan <ra...@apache.org>
Committed: Wed Oct 26 08:02:54 2016 +0530

----------------------------------------------------------------------
 CHANGES.txt                                     |  3 ++
 .../server/quorum/QuorumCnxManager.java         | 42 +++++++++-----------
 2 files changed, 22 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zookeeper/blob/6bd38e3d/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 9dd5729..6e05bfa 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -74,6 +74,9 @@ BUGFIXES:
   ZOOKEEPER-2606: SaslServerCallbackHandler#handleAuthorizeCallback() should log
   the exception (Ted Yu via fpj)
 
+  ZOOKEEPER-2442: Socket leak in QuorumCnxManager connectOne
+  (Michael Han via rakeshr)
+
 IMPROVEMENTS:
 
   ZOOKEEPER-2505: Use shared library instead of static library in C

http://git-wip-us.apache.org/repos/asf/zookeeper/blob/6bd38e3d/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java
----------------------------------------------------------------------
diff --git a/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java b/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java
index a06dde8..58c159b 100644
--- a/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java
+++ b/src/java/main/org/apache/zookeeper/server/quorum/QuorumCnxManager.java
@@ -237,9 +237,7 @@ public class QuorumCnxManager {
      * @param sid
      */
     public void testInitiateConnection(long sid) throws Exception {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Opening channel to server " + sid);
-        }
+        LOG.debug("Opening channel to server " + sid);
         Socket sock = new Socket();
         setSockOpts(sock);
         sock.connect(self.getVotingView().get(sid).electionAddr, cnxTO);
@@ -434,17 +432,14 @@ public class QuorumCnxManager {
             LOG.debug("There is a connection already for server " + sid);
             return true;
         }
-        try {
 
-             if (LOG.isDebugEnabled()) {
-                 LOG.debug("Opening channel to server " + sid);
-             }
-             Socket sock = new Socket();
+        Socket sock = null;
+        try {
+             LOG.debug("Opening channel to server " + sid);
+             sock = new Socket();
              setSockOpts(sock);
              sock.connect(electionAddr, cnxTO);
-             if (LOG.isDebugEnabled()) {
-                 LOG.debug("Connected to server " + sid);
-             }
+             LOG.debug("Connected to server " + sid);
              initiateConnection(sock, sid);
              return true;
          } catch (UnresolvedAddressException e) {
@@ -454,11 +449,13 @@ public class QuorumCnxManager {
              // detail.
              LOG.warn("Cannot open channel to " + sid
                      + " at election address " + electionAddr, e);
+             closeSocket(sock);
              throw e;
          } catch (IOException e) {
              LOG.warn("Cannot open channel to " + sid
                      + " at election address " + electionAddr,
                      e);
+             closeSocket(sock);
              return false;
          }
    
@@ -574,6 +571,10 @@ public class QuorumCnxManager {
      *            Reference to socket
      */
     private void closeSocket(Socket sock) {
+        if (sock == null) {
+            return;
+        }
+
         try {
             sock.close();
         } catch (IOException ie) {
@@ -614,7 +615,7 @@ public class QuorumCnxManager {
         public void run() {
             int numRetries = 0;
             InetSocketAddress addr;
-
+            Socket client = null;
             while((!shutdown) && (numRetries < 3)){
                 try {
                     ss = new ServerSocket();
@@ -632,7 +633,7 @@ public class QuorumCnxManager {
                     setName(addr.toString());
                     ss.bind(addr);
                     while (!shutdown) {
-                        Socket client = ss.accept();
+                        client = ss.accept();
                         setSockOpts(client);
                         LOG.info("Received connection request "
                                 + client.getRemoteSocketAddress());
@@ -654,6 +655,7 @@ public class QuorumCnxManager {
                         LOG.error("Interrupted while sleeping. " +
                             "Ignoring exception", ie);
                     }
+                    closeSocket(client);
                 }
             }
             LOG.info("Leaving listener");
@@ -739,9 +741,7 @@ public class QuorumCnxManager {
         }
                 
         synchronized boolean finish() {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Calling finish for " + sid);
-            }
+            LOG.debug("Calling finish for " + sid);
             
             if(!running){
                 /*
@@ -752,16 +752,14 @@ public class QuorumCnxManager {
             
             running = false;
             closeSocket(sock);
-            // channel = null;
 
             this.interrupt();
             if (recvWorker != null) {
                 recvWorker.finish();
             }
 
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Removing entry from senderWorkerMap sid=" + sid);
-            }
+            LOG.debug("Removing entry from senderWorkerMap sid=" + sid);
+
             senderWorkerMap.remove(sid, this);
             threadCnt.decrementAndGet();
             return running;
@@ -919,9 +917,7 @@ public class QuorumCnxManager {
             } finally {
                 LOG.warn("Interrupting SendWorker");
                 sw.finish();
-                if (sock != null) {
-                    closeSocket(sock);
-                }
+                closeSocket(sock);
             }
         }
     }