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 <[email protected]> Authored: Wed Oct 26 08:02:54 2016 +0530 Committer: Rakesh Radhakrishnan <[email protected]> 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); } } }
