[ https://issues.apache.org/jira/browse/ZOOKEEPER-2366?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15297685#comment-15297685 ]
Alexander Shraer commented on ZOOKEEPER-2366: --------------------------------------------- I think its actually worse - consider a reconfig changing just one client port, of one of the servers. All the other servers don't need to perform any operation besides updating the config in their memory, so they won't have any issue. The single server may object because it can't bind to the port, but the leader only needs a majority vote, so his objection may not arrive on time for the commit. I just want to point out that there is no voting in Paxos or ZooKeeper. Servers don't say no to the leader's proposals. Protocols in which servers can say no are distributed commit protocols (e.g., 2 phase commit, 3 phase commit, E3PC, etc.) but ZooKeeper solves consensus, in which servers don't have a Yes/No vote or veto powers. > 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)