Shutting down the netty server takes long time when using SSLHandler.

Trustin Lee tlee at redhat.com
Wed Apr 15 08:34:55 EDT 2009


Please try Revision 1187 before making the modification I suggested.
I've just checked in the potential fix for this issue.

— Trustin Lee, http://gleamynode.net/

On Wed, Apr 15, 2009 at 9:25 PM, Trustin Lee <tlee at redhat.com> wrote:
> Hi Virat,
>
> On Wed, Apr 15, 2009 at 8:33 PM, Virat Gohil <virat.gohil at gmail.com> wrote:
>> Hi All!
>>
>> I am facing a small problem shutting down my Netty based server with
>> ~1200 connections.
>>
>> I am using the ChannelGroup as described in Getting Started guide,
>> following is the code:
>>
>> public void stop()
>>        {
>>                if(timer!=null)
>>                {
>>                        timer.stop();
>>                }
>>                if(g!=null && factory!=null)
>>                {
>>                         ChannelGroupFuture future = g.close();
>>                         future.awaitUninterruptibly();
>>                        if(ch!=null)
>>                        {
>>                                ch.unbind();
>>                        }
>>                        try {
>>                                bossExecutor.shutdownNow();
>>                                workerExecutor.shutdownNow();
>>                                workerExecutor.awaitTermination(3600, TimeUnit.SECONDS);
>>                        bossExecutor.awaitTermination(3600, TimeUnit.SECONDS);
>>                        } catch (InterruptedException e) {
>>                                //print the exception
>>                        }
>>                        factory.releaseExternalResources();
>>                }
>>        }
>>
>> The execution gets stuck at future.awaitUninterruptibly(); I tried
>> debugging the issue and found the following:
>>
>> 1. when g.close() is called the channel group creates a hashtable and
>> creates a new DefaultChannelGroupFuture, which becomes the registered
>> listener on all these channels.
>> 2. Whenever channel.close() is called, the DefaultChannelGroupFuture
>> gets called and increments the succes/failure count.
>> 3. if the success+failure count=number of channels in the group, then
>> the operation is considered finished and the thread waiting on the
>> defaultchannelgroupfuture is released.
>>
>> I observed in SSLHandler that Channels.close() is called only if the
>> received frame was empty and the inbound was finished:
>> SSLHandler.java:406 (decode())
>>       if (frame == null && engine.isInboundDone()) {
>>            synchronized (closeFutures) {
>>                for (;;) {
>>                    ChannelFuture future = closeFutures.poll();
>>                    if (future == null) {
>>                        break;
>>                    }
>>                    Channels.close(ctx, future);
>>                }
>>            }
>>        }
>> Sometimes, either the frame is not null or inbound is not completed,
>> this causes the SSLHandler to continue decoding.  This leads in
>> DefaultChannelGroupFuture.childListener.operationComplete() being
>> called after a very long time.
>
> 1) What is the state of the actual connection?  Is it closed or still connected?
>
> 2) What happens if you replace:
>
>        if (frame == null && engine.isInboundDone()) {
> with:
>
>        if (frame == null && engine.isInboundDone() || !channel.isConnected()) {
>
> ?
>
>> What we would prefer to do, is to abandon the incomplete data in
>> SSLHandler.decode() and close the channel immediately as soon as the
>> server's shutdown method is called. Please let me know if I am missing
>> something or if there is another way of achieving a faster shutdown.
>
> You are doing correctly and the ChannelGroupFuture should return
> quickly.  Thanks for reporting the problem!
>
> Trustin
>




More information about the netty-users mailing list