[ https://issues.apache.org/jira/browse/ZOOKEEPER-2366?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15302646#comment-15302646 ]
Chris Nauroth commented on ZOOKEEPER-2366: ------------------------------------------ [~shralex], thanks for the reply. Yes, I agree on all 3 points. I also agree that 1+2 in 3.5.2 is a viable plan, with 3 to go into a separate JIRA targeted to a later release. If others disagree, then I'd also be comfortable deferring the whole thing in the interest of building consensus and moving ahead with a 3.5.2 release candidate. [~fpj], what is your opinion? > Reconfiguration of client port causes a socket leak > --------------------------------------------------- > > Key: ZOOKEEPER-2366 > URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2366 > Project: ZooKeeper > Issue Type: Bug > Components: quorum > Affects Versions: 3.5.0 > Reporter: Timothy Ward > Assignee: Flavio Junqueira > Priority: Blocker > Fix For: 3.5.2 > > Attachments: ZOOKEEPER-2366.patch, ZOOKEEPER-2366.patch, > zookeeper.patch > > > The NIOServerCnxnFactory reconfigure method can leak server sockets, and > hence make ports unusable until the JVM restarts: > The first line of the method takes a reference to the current > ServerSocketChannel and then the next line replaces it. The subsequent > interactions with the server socket can fail (for example if the > reconfiguration tries to bind to an in-use port). If they fail *before* the > call to oldSS.close() then oldSS is *never* closed. This holds that port open > forever, and prevents the user from rolling back to the previous port! > The code from reconfigure is shown below: > ServerSocketChannel oldSS = ss; > try { > this.ss = ServerSocketChannel.open(); > ss.socket().setReuseAddress(true); > LOG.info("binding to port " + addr); > ss.socket().bind(addr); > ss.configureBlocking(false); > acceptThread.setReconfiguring(); > oldSS.close(); > acceptThread.wakeupSelector(); > try { > acceptThread.join(); > } catch (InterruptedException e) { > LOG.error("Error joining old acceptThread when > reconfiguring client port " + e.getMessage()); > } > acceptThread = new AcceptThread(ss, addr, selectorThreads); > acceptThread.start(); > } catch(IOException e) { > LOG.error("Error reconfiguring client port to " + addr + " " + > e.getMessage()); > } -- This message was sent by Atlassian JIRA (v6.3.4#6332)