Shutting down the netty server takes long time when using SSLHandler.
Virat Gohil
virat4lug at gmail.com
Wed Apr 15 08:58:40 EDT 2009
Hi Trustin,
Thanks for the quick response!! :)
I tried your suggestion on revision 1187, same result. I am willing to
test more suggestions :)
Thanks,
Virat
On Wed, Apr 15, 2009 at 6:04 PM, Trustin Lee <tlee at redhat.com> wrote:
> 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
>>
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
>
More information about the netty-users
mailing list