camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CAMEL-10024) Race condition in Mina2Producer/Mina2Consumer when closing connections with disconnect=true
Date Fri, 17 Jun 2016 14:49:05 GMT

    [ https://issues.apache.org/jira/browse/CAMEL-10024?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15336238#comment-15336238
] 

ASF GitHub Bot commented on CAMEL-10024:
----------------------------------------

GitHub user anoordover opened a pull request:

    https://github.com/apache/camel/pull/1043

    CAMEL-10024: sync on close and deprecation

    Synchronizing on close method in handler

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/anoordover/camel CAMEL-10024

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/camel/pull/1043.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #1043
    
----
commit fe41b1bb9ac743214a6f6baba393a251e55037fc
Author: Arno Noordover <anoordover@users.noreply.github.com>
Date:   2016-06-17T14:47:14Z

    CAMEL-10024: sync on close and deprecation

----


> Race condition in Mina2Producer/Mina2Consumer when closing connections with disconnect=true
> -------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-10024
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10024
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-mina2
>    Affects Versions: 2.17.1
>         Environment: Tested on Windows using Java 1.8.0_91
>            Reporter: Niels Ull Harremoes
>
> There is a race condition in the Mina2Producer when trying to close connections after
use by setting disconnect=true or
> setting CamelMina2CloseSessionWhenComplete=true. 
> Connections will not be fully closed in the method maybeDisconnectOnDone. 
> The call to session.close(true) returns a CloseFuture - one must await this to ensure
the session is really closed.
> In the current implementation, there is no await on the CloseFuture. This means that
the producer will be returned to the pool before the session is closed. If the next call comes
right after, it is very likely that it will get the same producer and that the session will
suddenly be closed while in use, leading to errors like 
> ExchangeTimedOutException: The OUT message was not received within 30000 ms
> or 
> java.lang.IllegalStateException: handler cannot be set while the service is active.
> The fix is trivial - just change line 221 in Mina2Producer.java from
> {code:java}
> session.close(true);
> {code} 
> to 
> {code:java}
> long timeout = getEndpoint().getConfiguration().getTimeout();          
> CloseFuture closeFuture = session.close(true);  
> closeFuture.awaitUninterruptibly(timeout, TimeUnit.MILLISECONDS);
> {code}
> But the unit testing might be more complex.
> There might be a similar issue in Mina2Consumer - but I could not provoke it as easily.
> Here is a small program demonstrating the problem - on my system it will fail within
the first 50 iterations. When looking at the debug log, it is clear that the connections are
closed too late - after the next iteration has started.
> {code:java}
> import org.apache.camel.*;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.impl.DefaultCamelContext;
> import org.slf4j.*;
> /**
>  * Demonstrating race condition
>  */
> public class Main {
>     public static void main(String[] args) throws Exception {
>         System.setProperty("org.slf4j.simpleLogger.log.org.apache.camel.component.mina2.Mina2Producer",
"trace");
>         System.setProperty("org.slf4j.simpleLogger.log.org.apache.mina.filter.logging.LoggingFilter",
"trace");
>         
>         Logger logger = LoggerFactory.getLogger(Main.class);
>         CamelContext context = new DefaultCamelContext();
>         context.addRoutes(new RouteBuilder() {
>             @Override
>             public void configure() throws Exception {
>                 from("mina2:tcp://localhost:20000?sync=true").setBody(simple("Hello ${in.body}"));
>             }
>         });
>         ProducerTemplate producerTemplate = context.createProducerTemplate();
>         context.start();
>         try {
>             for (int i = 0; i < 10000; i++) {
>                 logger.info("---- Call # " + i);
>                 String result = (String) producerTemplate.requestBody("mina2:tcp://localhost:20000?disconnect=true&timeout=1000&sync=true&minaLogger=true",
"world " + i);
>                 logger.info("---- End call # " + i + ": " + result);
>             }
>         } finally {
>             context.stop();
>         }
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message