[ 
https://issues.apache.org/jira/browse/DIRMINA-819?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Emmanuel Lecharny closed DIRMINA-819.
-------------------------------------

    
> Synchronous behavior while adding and removing connections
> ----------------------------------------------------------
>
>                 Key: DIRMINA-819
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-819
>             Project: MINA
>          Issue Type: Bug
>    Affects Versions: 2.0.0-RC1, 2.0.0, 2.0.1, 2.0.2
>         Environment: java version "1.6.0_22"
> Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
> Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03, mixed mode)
>            Reporter: John R. Fallows
>            Assignee: Emmanuel Lecharny
>             Fix For: 2.0.3
>
>         Attachments: sync.patch
>
>
> We discovered some blocking behavior in the Mina AbstractPollingIoProcessor 
> that is triggered while adding and removing connections.
> This class manages an internal worker that must be started when the first 
> connection is added, and stopped when the last connection is removed.
> The code achieves this by using a synchronized block in startupProcessor() as 
> follows:
>     public final void remove(T session) {
>         scheduleRemove(session);
>         startupProcessor();
>     }
>     private void scheduleRemove(T session) {
>         removingSessions.add(session);
>     }
>     private void startupProcessor() {
>         synchronized (lock) {
>             if (processor == null) {
>                 processor = new Processor();
>                 executor.execute(new NamePreservingRunnable(processor,
>                         threadName));
>             }
>         }
>         // Just stop the select() and start it again, so that the processor
>         // can be activated immediately. 
>         wakeup();
>     }
> Each call to session.close() triggers the "filterClose" event on the filter 
> chain, ending in a call to removeSession (shown above) where the synchronized 
> lock is obtained to verify that the processor is running in order to close 
> the connection.  When a large number of connections are closed at the same 
> time, they will contend for the synchronized lock.  Similar behavior occurs 
> when new connections are established via addSession (not shown here).  Both 
> removeSession and addSession synchronize on the same lock, so they also 
> contend with each other as connections come and go.
> Note that we found similar behavior in AbstractPollingIoAcceptor and 
> AbstractPollingIoConnector as well.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to