Closed TCP Channel (Netty 3.1.1GA)
"이희승 (Trustin Lee)"
trustin at gmail.com
Sun Aug 23 20:57:04 EDT 2009
Thomas,
Thanks a lot for investigating this issue. I checked in the fix and
will release 3.1.2.GA today to address this critical issue.
Trustin
On 08/23/2009 05:02 PM, Thomas Bocek wrote:
> Hi Trustin,
>
> I investigated a bit more in this issue and found in
> NioClientSocketPipelineSink.java, in line 356 the method
> processConnectTimeout() that is called every ~500ms to check if a
> connection has timed out. In this method, the selector's key set are
> iterated and once a while there is a SelectionKey that is invalid and
> the channel is closed:
>
> Line 359, NioClientSocketPipelineSink.java
> private void processConnectTimeout(Set<SelectionKey> keys, long
> currentTimeNanos) {
> ConnectException cause = null;
> for (SelectionKey k: keys) {
> if (!k.isValid()) {
> close(k);
> continue;
> }
> ...
>
> However, the selectionKey is invalid because it has been successfully
> finished in connect() in Line 384. So the connection is established and
> the selectionKey is canceld. The SelectionKey remains in the set because
> from the Java API it says: "Keys may be cancelled and
> channels may be closed at any time. Hence the presence of a key in one
> or more of a selector's key sets does not imply that the key is valid or
> that its channel is open." The result is that the connection is closed
> (ClosedChannelException) even though it was successful. I think the
> correct behavior of this method should be:
>
> private void processConnectTimeout(Set<SelectionKey> keys, long
> currentTimeNanos) {
> ConnectException cause = null;
> if (k.isValid()) {
> NioClientSocketChannel ch = (NioClientSocketChannel) k.attachment();
> ...
>
> The check for timeout should only be for valid SelectionKeys as invalid
> keys are canceled or closed anyway. Second, the isConnectable is already
> handled by processSelectedKeys(), so I think there is no need for that.
>
> Thomas
>
> Thomas Bocek wrote:
>> Hi,
>>
>> I'm having the following issue that once a while I get an exception due
>> to a ClosedChannelException. I made a test and this happens once per
>> every 10'000 connections or so and its very undeterministic. In the test
>> I open locally a connection, send data, wait for a reply, and close it.
>> Most of the time opening connection works, but in rare occasions it does
>> not.
>>
>> The exception gets set in:
>>
>> NioWorker, 731:
>>
>> if (localAddress == null || remoteAddress == null) {
>> if (future != null) {
>> future.setFailure(new ClosedChannelException());
>> }
>> close(channel, succeededFuture(channel));
>> return;
>> }
>>
>> Here, localAddress is null, and remoteAddress is null. Before the future
>> is set, as far as I can see, NioClientSocketPipelineSink in line 146
>> calls register(...):
>>
>> if (channel.socket.connect(remoteAddress)) {
>> channel.worker.register(channel, future);
>> } else {
>> future.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
>> channel.connectFuture = future;
>> boss.register(channel);
>> }
>>
>> The socket in the NioClientSocketChannel class says: bound=false,
>> closed=false, connected=false, created=false, and the selector is open
>> so I expect that boss.register(...) is called.
>>
>> Here is the stacktrace:
>>
>> Thread [New I/O client worker #1-2] (Suspended (breakpoint at line 299
>> in DefaultChannelFuture))
>> DefaultChannelFuture.setFailure(Throwable) line: 299
>> NioWorker$RegisterTask.run() line: 731
>> NioWorker.processRegisterTaskQueue() line: 260
>> NioWorker.run() line: 199
>> ThreadRenamingRunnable.run() line: 113
>> IoWorkerRunnable.run() line: 53
>> ThreadPoolExecutor$Worker.runTask(Runnable) line: 886
>> ThreadPoolExecutor$Worker.run() line: 908
>> Thread.run() line: 619
>>
>> How and when is it safe to assume that a channel is connected and has a
>> local and remote address set?
>>
>> I'm not sure if there is a mistake in my code (more likely) or in Netty.
>>
>>
>> Thomas
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> netty-users mailing list
>> netty-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/netty-users
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
--
- Trustin Lee, http://gleamynode.net/
More information about the netty-users
mailing list