You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Niklas Therning (JIRA)" <ji...@apache.org> on 2006/02/22 11:33:38 UTC

[jira] Reopened: (DIRMINA-169) Deadlock in ThreadPoolFilter

     [ http://issues.apache.org/jira/browse/DIRMINA-169?page=all ]
     
Niklas Therning reopened DIRMINA-169:
-------------------------------------

     Assign To: Niklas Therning  (was: Trustin Lee)

I've recently run into this bug myself I think. The fix doesn't seem to help. It's a real showstopper since my SocketAcceptor hangs as well and no more connections are accepted. I've reassigned the issue to me and I will investigate further tonight. My thread dump:

 "ThreadPoolWorker-9" prio=1 tid=0x0882f280 nid=0x281d waiting for monitor entry [0x880f7000..0x880f7780]
       at org.apache.mina.common.support.IoFilterLifeCycleManager.decreaseCountSafely(IoFilterLifeCycleManager.java:182)
       - waiting to lock <0x928b5590> (a org.apache.mina.common.support.IoFilterLifeCycleManager)
       at org.apache.mina.common.support.IoFilterLifeCycleManager.callOnPostRemove(IoFilterLifeCycleManager.java:176)
       at org.apache.mina.common.support.AbstractIoFilterChain.deregister(AbstractIoFilterChain.java:358)
       at org.apache.mina.common.support.AbstractIoFilterChain.remove(AbstractIoFilterChain.java:295)
       - locked <0x9787b1d8> (a org.apache.mina.transport.socket.nio.support.SocketFilterChain)
       at org.apache.mina.common.support.AbstractIoFilterChain.clear(AbstractIoFilterChain.java:304)
       - locked <0x9787b1d8> (a org.apache.mina.transport.socket.nio.support.SocketFilterChain)
       at org.apache.mina.common.support.AbstractIoFilterChain$2.sessionClosed(AbstractIoFilterChain.java:168)
       at org.apache.mina.common.support.AbstractIoFilterChain.callNextSessionClosed(AbstractIoFilterChain.java:453)
       at org.apache.mina.common.support.AbstractIoFilterChain.access$700(AbstractIoFilterChain.java:52)
       at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.sessionClosed(AbstractIoFilterChain.java:742)
       at org.apache.mina.filter.ThreadPoolFilter.processEvent(ThreadPoolFilter.java:687)
       at org.apache.mina.filter.ThreadPoolFilter$Worker.processEvents(ThreadPoolFilter.java:421)
       at org.apache.mina.filter.ThreadPoolFilter$Worker.run(ThreadPoolFilter.java:376)

 "ThreadPoolWorker-8" prio=1 tid=0x8a5e1268 nid=0x281c in Object.wait() [0x889ff000..0x889ff800]
       at java.lang.Object.wait(Native Method)
       - waiting on <0x97879a28> (a org.apache.mina.filter.ThreadPoolFilter$Worker)
       at java.lang.Thread.join(Thread.java:1103)
       - locked <0x97879a28> (a org.apache.mina.filter.ThreadPoolFilter$Worker)
       at org.apache.mina.filter.ThreadPoolFilter.destroy(ThreadPoolFilter.java:209)
       at org.apache.mina.common.support.IoFilterLifeCycleManager.callDestroyIfNecessary(IoFilterLifeCycleManager.java:214)
       - locked <0x928b5590> (a org.apache.mina.common.support.IoFilterLifeCycleManager)
       at org.apache.mina.common.support.AbstractIoFilterChain.deregister(AbstractIoFilterChain.java:363)
       at org.apache.mina.common.support.AbstractIoFilterChain.remove(AbstractIoFilterChain.java:295)
       - locked <0x9787be90> (a org.apache.mina.transport.socket.nio.support.SocketFilterChain)
       at org.apache.mina.common.support.AbstractIoFilterChain.clear(AbstractIoFilterChain.java:304)
       - locked <0x9787be90> (a org.apache.mina.transport.socket.nio.support.SocketFilterChain)
       at org.apache.mina.common.support.AbstractIoFilterChain$2.sessionClosed(AbstractIoFilterChain.java:168)
       at org.apache.mina.common.support.AbstractIoFilterChain.callNextSessionClosed(AbstractIoFilterChain.java:453)
       at org.apache.mina.common.support.AbstractIoFilterChain.access$700(AbstractIoFilterChain.java:52)
       at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.sessionClosed(AbstractIoFilterChain.java:742)
       at org.apache.mina.filter.ThreadPoolFilter.processEvent(ThreadPoolFilter.java:687)
       at org.apache.mina.filter.ThreadPoolFilter$Worker.processEvents(ThreadPoolFilter.java:421)
       at org.apache.mina.filter.ThreadPoolFilter$Worker.run(ThreadPoolFilter.java:376)

 "SocketAcceptor-0" prio=1 tid=0x087b1cc0 nid=0x105d waiting for monitor entry [0x8c6ff000..0x8c6ff680]
       at org.apache.mina.common.support.AbstractIoFilterChain.register(AbstractIoFilterChain.java:316)
       - waiting to lock <0x928b5590> (a org.apache.mina.common.support.IoFilterLifeCycleManager)
       at org.apache.mina.common.support.AbstractIoFilterChain.addLast(AbstractIoFilterChain.java:271)
       - locked <0x9787c108> (a org.apache.mina.transport.socket.nio.support.SocketFilterChain)
       at org.apache.mina.common.DefaultIoFilterChainBuilder.buildFilterChain(DefaultIoFilterChainBuilder.java:241)
       at org.apache.mina.transport.socket.nio.support.SocketAcceptorDelegate$Worker.processSessions(SocketAcceptorDelegate.java:411)


> Deadlock in ThreadPoolFilter
> ----------------------------
>
>          Key: DIRMINA-169
>          URL: http://issues.apache.org/jira/browse/DIRMINA-169
>      Project: Directory MINA
>         Type: Bug
>     Versions: 0.9
>     Reporter: Rurik Krylov
>     Assignee: Niklas Therning
>      Fix For: 0.9.2

>
> The dedlock occurs in case of simultaniously closing sessions. You can find thread dumps below. 
> When 2 threads reach synchronized method callDestroyIfNecessary, reference count is 0 already. So first thread tries to interrupt() second worker, but it cannot be interrupted because it is lying on the synch block. 
> I'm not familar with this architecture, but from my point of of view ThreadPoolFilter as singleton should not have too many synchronized methods. In this particular case, synchronization of method callDestroyIfNecessary should be narrowed to synchronisztion collection operations only.
> filter.destroy() need not of synchronisation, and just it causes the deadlock.
> IoThreadPool-3@547 prio=5, in group "main", status: WAIT
> 	 blocks IoThreadPool-1@548
> 	 blocks SocketAcceptor-0@4e9
> 	  wait():-1, Object.java
> 	  join():1103, Thread.java
> 	  destroy():209, ThreadPoolFilter.java
> 	  callDestroyIfNecessary():171, IoFilterLifeCycleManager.java
> 	  deregister():363, AbstractIoFilterChain.java
> 	  remove():295, AbstractIoFilterChain.java
> 	  clear():304, AbstractIoFilterChain.java
> 	  sessionClosed():168, AbstractIoFilterChain.java
> 	  callNextSessionClosed():453, AbstractIoFilterChain.java
> 	  access$700():52, AbstractIoFilterChain.java
> 	  sessionClosed():742, AbstractIoFilterChain.java
> 	  sessionClosed():165, ProtocolCodecFilter.java
> 	  callNextSessionClosed():453, AbstractIoFilterChain.java
> 	  access$700():52, AbstractIoFilterChain.java
> 	  sessionClosed():742, AbstractIoFilterChain.java
> 	  processEvent():687, ThreadPoolFilter.java
> 	  processEvents():421, ThreadPoolFilter.java
> 	  run():376, ThreadPoolFilter.java
> IoThreadPool-1@548 prio=5, in group "main", status: MONITOR
> 	 waiting for IoThreadPool-3@547
> 	  callDestroyIfNecessary():160, IoFilterLifeCycleManager.java
> 	  deregister():363, AbstractIoFilterChain.java
> 	  remove():295, AbstractIoFilterChain.java
> 	  clear():304, AbstractIoFilterChain.java
> 	  sessionClosed():168, AbstractIoFilterChain.java
> 	  callNextSessionClosed():453, AbstractIoFilterChain.java
> 	  access$700():52, AbstractIoFilterChain.java
> 	  sessionClosed():742, AbstractIoFilterChain.java
> 	  sessionClosed():165, ProtocolCodecFilter.java
> 	  callNextSessionClosed():453, AbstractIoFilterChain.java
> 	  access$700():52, AbstractIoFilterChain.java
> 	  sessionClosed():742, AbstractIoFilterChain.java
> 	  processEvent():687, ThreadPoolFilter.java
> 	  processEvents():421, ThreadPoolFilter.java
> 	  run():376, ThreadPoolFilter.java

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira