Yep I'll review it, but can't do it before mid next week.

On Jun 18, 2016 7:39 PM, "Chris Nauroth (JIRA)" <j...@apache.org> wrote:

>
>     [
> https://issues.apache.org/jira/browse/ZOOKEEPER-2366?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15338013#comment-15338013
> ]
>
> Chris Nauroth commented on ZOOKEEPER-2366:
> ------------------------------------------
>
> [~fpj], thank you for the new patch.
>
> This is a repeat of an earlier comment: This wasn't introduced by your
> patch, but it's generally a bad practice to catch an
> {{InterruptedException}} and neither propagate it nor re-raise the
> interrupted status. Other layers of code might be expecting to react to
> thread interruption. Since we're touching this code, do you think we should
> add a call to {{Thread.currentThread().interrupt()}}?
>
> {code}
>     public void reconfigure(InetSocketAddress addr) {
>        Channel oldChannel = parentChannel;
>        try {
>            LOG.info("binding to port " + addr);
>            parentChannel = bootstrap.bind(addr);
>            localAddress = addr;
>        } catch (Exception e) {
>            LOG.error("Error while reconfiguring", e);
>        } finally {
>            oldChannel.close();
>        }
>     }
> {code}
>
> I don't see a checked exception raised in that code block.  Is the catch
> block there in anticipation of an unchecked exception that you've seen?
>
> Hmmm... this isn't directly related to your patch, but something seems odd
> here.  The Netty bind and close calls are asynchronous, so when this method
> returns, it's not guaranteed that the bind and close have completed.  I
> wonder if we have a race condition lurking.
>
> A very minor nitpick:
>
> *NIOServerCnxnFactory.java:*
> {code}
>             LOG.info("binding to port " + addr);
> {code}
>
> {code}
>                 LOG.error("Error joining old acceptThread when
> reconfiguring client port " + e.getMessage());
> {code}
>
> {code}
>             LOG.error("Error reconfiguring client port to " + addr + " " +
> e.getMessage());
> {code}
>
> *NettyServerCnxnFactory:*
> {code}
>            LOG.info("binding to port " + addr);
> {code}
>
> Since we're touching these lines of code anyway for the reformatting,
> let's take the opportunity to switch to the SLF4J calling convention with
> {} token substitutions.
>
> [~shralex], would you also like to review the latest approach?
>
> > 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-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)
>

Reply via email to