The only workaround I can think of right now is to do a thread switch.
That is; A session which receives some data needs to post the data to a
thread pool, and let that pool call write on the destination session. 

It sounds a bit bad :(

   

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
> Sent: 30 October 2006 10:45
> To: mina-dev@directory.apache.org
> Subject: Deadlock in Mina 1.0.0
> 
> Hi all,
> 
> I'm having some problems with a deadlock in Mina 1.0.0. We are using
> Java 5 on Windows XP, so I had to apply DIRMINA-277.patch.
> 
> I have only created a snapshot (from Eclipse) of the two threads which
> are involved in the deadlock (see below). It looks like both 
> threads are
> blocked at:
> 
> BaseIoSession.write:
> 
>    public WriteFuture write( Object message, SocketAddress 
> remoteAddress
> )
>     {
>         synchronized( this )  // <-- deadlock here
>         {
>             if( isClosing() || !isConnected() )
>             {
>                 return DefaultWriteFuture.newNotWrittenFuture( this );
>             }
>         }
> 
>         WriteFuture future = new DefaultWriteFuture( this );
>         write0( new WriteRequest( message, future, remoteAddress ) );
>         
>         return future;
>     }
> 
> 
> The thread snapshots shows that both treads already owns a lock and
> wants a lock on another instance. 
> 
> (After a few moments of thinking) I think I know why the deadlock
> occures. Mina is used by a routing instance, which have a front
> connection and multiple backend connections. The class
> DataStructureProtocolHandler in the trace below is an instance of
> IoHandler. The trace shows that one IoHandler receives a message and
> routs it to another IoHandler. So messageReceived is causing 
> a call to a
> method on another IoHandler 
> (DatastructureProtocolHandler.consume). The
> consume method is calling write on another IoSession.
> 
> The deadlock occures when the front connection receives a 
> message and is
> trying to sent it to a backend connection while that backend 
> connection
> at the same time is trying to write a response back to the front
> connection. 
> 
> How should I solve the problem? We have never had any problems with
> prior versions of Mina and it happens very often with 1.0.0. 
> We have now
> reverted back to a prior version. 
> 
> 
> Thanks for your time :)
> Kaj
> 
> 
> 
> -- Beginning of snapshot of the two threads
> 
> Thread [AnonymousIoService-5] (Suspended)     
>       owns: SocketSessionImpl  (id=164)       
>               waited by: Thread [SocketAcceptorIoProcessor-0.0]
> (Running)     
>               waited by: Thread [AnonymousIoService-16] (Suspended)   
>               waited by: Thread [Timer-1] (Running)   
>       waiting for: SocketSessionImpl  (id=183)        
>               owned by: Thread [AnonymousIoService-16] (Suspended)    
>       SocketSessionImpl(BaseIoSession).write(Object, SocketAddress)
> line: 137     
>       SocketSessionImpl(BaseIoSession).write(Object) line: 132        
>       DatastructureProtocolHandler.consume(ByteMessage, boolean) line:
> 538   
>       DataConnector.consume(IDataSet, boolean) line: 109      
>       BackendHandler.consume(IDataSet, boolean) line: 65      
>       RoutingService.routeToBackend(RoutingInformation, String,
> String, String, IDataSet) line: 458   
>       RoutingService.routeNewMessage(RoutingAlgorithm, String, String,
> String, String, String, IDataSet) line: 406   
>       RoutingService.routeMessage(RoutingAlgorithm, String,
> RoutingService$Request, IDataSet) line: 344   
>       RoutingService.onIncomingMessage(IDataSet) line: 193    
>       FrontendHandler.consume(IDataSet, boolean) line: 62     
>       DataConnector.consume(ByteMessage, boolean) line: 130   
>       DatastructureProtocolHandler.messageReceived(IoSession, Object)
> line: 465     
>       AbstractIoFilterChain$2.messageReceived(IoFilter$NextFilter,
> IoSession, Object) line: 189  
>       
> SocketFilterChain(AbstractIoFilterChain).callNextMessageReceiv
> ed(IoFilte
> rChain$Entry, IoSession, Object) line: 502    
>       AbstractIoFilterChain.access$1000(AbstractIoFilterChain,
> IoFilterChain$Entry, IoSession, Object) line: 52      
>       AbstractIoFilterChain$EntryImpl$1.messageReceived(IoSession,
> Object) line: 777     
>       ExecutorFilter.processEvent(IoFilter$NextFilter, IoSession,
> ExecutorFilter$EventType, Object) line: 243   
>       ExecutorFilter$ProcessEventsRunnable.run() line: 305    
>       ThreadPoolExecutor$Worker.runTask(Runnable) line: 650   
>       ThreadPoolExecutor$Worker.run() line: 675       
>       Thread.run() line: 595  
> 
> 
> 
> Thread [AnonymousIoService-16] (Suspended)    
>       owns: SocketSessionImpl  (id=183)       
>               waited by: Thread [AnonymousIoService-12] (Running)     
>               waited by: Thread [AnonymousIoService-5] (Suspended)    
>                       owns: SocketSessionImpl  (id=164)       
>                               waited by: Thread
> [SocketAcceptorIoProcessor-0.0] (Running)     
>                               waited by: Thread
> [AnonymousIoService-16] (Suspended)   
>                               waited by: Thread [Timer-1] (Running)   
>               waited by: Thread [SocketAcceptorIoProcessor-1.0]
> (Suspended)   
>               waited by: Thread [Timer-2] (Running)   
>       waiting for: SocketSessionImpl  (id=164)        
>               owned by: Thread [AnonymousIoService-5] (Suspended)     
>       SocketSessionImpl(BaseIoSession).write(Object, SocketAddress)
> line: 137     
>       SocketSessionImpl(BaseIoSession).write(Object) line: 132        
>       DatastructureProtocolHandler.consume(ByteMessage, boolean) line:
> 538   
>       DataConnector.consume(IDataSet, boolean) line: 109      
>       FrontendHandler.consume(IDataSet, boolean) line: 64     
>       RoutingService.handleResponseMessage(String, IDataSet) line: 563
> 
>       RoutingService.onBackendMessage(IDataSet) line: 532     
>       BackendHandler.consume(IDataSet, boolean) line: 61      
>       DataConnector.consume(ByteMessage, boolean) line: 130   
>       DatastructureProtocolHandler.messageReceived(IoSession, Object)
> line: 465     
>       AbstractIoFilterChain$2.messageReceived(IoFilter$NextFilter,
> IoSession, Object) line: 189  
>       
> SocketFilterChain(AbstractIoFilterChain).callNextMessageReceiv
> ed(IoFilte
> rChain$Entry, IoSession, Object) line: 502    
>       AbstractIoFilterChain.access$1000(AbstractIoFilterChain,
> IoFilterChain$Entry, IoSession, Object) line: 52      
>       AbstractIoFilterChain$EntryImpl$1.messageReceived(IoSession,
> Object) line: 777     
>       ExecutorFilter.processEvent(IoFilter$NextFilter, IoSession,
> ExecutorFilter$EventType, Object) line: 243   
>       ExecutorFilter$ProcessEventsRunnable.run() line: 305    
>       ThreadPoolExecutor$Worker.runTask(Runnable) line: 650   
>       ThreadPoolExecutor$Worker.run() line: 675       
>       Thread.run() line: 595  
> 
> 
> 

Reply via email to