[
https://issues.apache.org/jira/browse/ZOOKEEPER-1179?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13855459#comment-13855459
]
Rakesh R commented on ZOOKEEPER-1179:
-------------------------------------
Thanks for reviewing the patch. IMO, the problem exists in the following way:
While closing the channel, it hits an exception and enters into the
exceptionCaught logic. Here this is again trying to close the channel and is
causing the issue. The stacktrace given in the description is also showing the
same, please see once. As this is an open issue from netty code [NETTY-412],
workaround would be to skip the closure in exceptionCaught if it was occured
from channel#close. Whats your opinion?
Also, I observed channel.close(); will generate ChannelDisconnected event, here
the NettyServerCnxn#close is invoked and doing the cleanup.
As an improvement let me check, NettyServerCnxn#close instead of
channel.close() in the NettyServerCnxn.sendBuffer(), but this won't fix the
above mentioned case.
> NettyServerCnxn does not properly close socket on 4 letter word requests
> ------------------------------------------------------------------------
>
> Key: ZOOKEEPER-1179
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1179
> Project: ZooKeeper
> Issue Type: Bug
> Components: server
> Affects Versions: 3.4.0
> Reporter: Camille Fournier
> Assignee: Rakesh R
> Priority: Critical
> Fix For: 3.4.6, 3.5.0
>
> Attachments: ZOOKEEPER-1179.patch
>
>
> When calling a 4-letter-word to a server configured to use
> NettyServerCnxnFactory, the factory will not properly cancel all the keys and
> close the socket after sending the response for the 4lw. The close request
> will throw this exception, and the thread will not shut down:
> 2011-09-13 12:14:17,546 - WARN [New I/O server worker
> #1-1:NettyServerCnxnFactory$CnxnChannelHandler@117] - Exception caught [id:
> 0x009300cc, /1.1.1.1:38542 => /139.172.114.138:2181] EXCEPTION:
> java.io.IOException: A non-blocking socket operation could not be completed
> immediately
> java.io.IOException: A non-blocking socket operation could not be completed
> immediately
> at sun.nio.ch.SocketDispatcher.close0(Native Method)
> at sun.nio.ch.SocketDispatcher.preClose(SocketDispatcher.java:44)
> at
> sun.nio.ch.SocketChannelImpl.implCloseSelectableChannel(SocketChannelImpl.java:684)
> at
> java.nio.channels.spi.AbstractSelectableChannel.implCloseChannel(AbstractSelectableChannel.java:201)
> at
> java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:97)
> at
> org.jboss.netty.channel.socket.nio.NioWorker.close(NioWorker.java:593)
> at
> org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:119)
> at
> org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:76)
> at org.jboss.netty.channel.Channels.close(Channels.java:720)
> at
> org.jboss.netty.channel.AbstractChannel.close(AbstractChannel.java:208)
> at
> org.apache.zookeeper.server.NettyServerCnxn.close(NettyServerCnxn.java:116)
> at
> org.apache.zookeeper.server.NettyServerCnxn.cleanupWriterSocket(NettyServerCnxn.java:241)
> at
> org.apache.zookeeper.server.NettyServerCnxn.access$0(NettyServerCnxn.java:231)
> at
> org.apache.zookeeper.server.NettyServerCnxn$CommandThread.run(NettyServerCnxn.java:314)
> at
> org.apache.zookeeper.server.NettyServerCnxn$CommandThread.start(NettyServerCnxn.java:305)
> at
> org.apache.zookeeper.server.NettyServerCnxn.checkFourLetterWord(NettyServerCnxn.java:674)
> at
> org.apache.zookeeper.server.NettyServerCnxn.receiveMessage(NettyServerCnxn.java:791)
> at
> org.apache.zookeeper.server.NettyServerCnxnFactory$CnxnChannelHandler.processMessage(NettyServerCnxnFactory.java:217)
> at
> org.apache.zookeeper.server.NettyServerCnxnFactory$CnxnChannelHandler.messageReceived(NettyServerCnxnFactory.java:141)
> at
> org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
> at
> org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
> at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:350)
> at
> org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:281)
> at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:201)
> at
> org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> at java.lang.Thread.run(Thread.java:619)
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)