You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by Hernan Sigliani <he...@fluxit.com.ar> on 2012/02/03 18:57:49 UTC

servicemix-http-2011.02 timeout issue using managed servlet

Hi,
    I'm currently working on the testing of the compatibility of our
services developed for smx 3.3.2 on the new 3.4.0 platform, since we
are thinking upgrade to that version.
I found an issue in the http:consumer component (2011.02) that makes
all http requests get a timeout exception. That is not happening in
previous versions such as 2009.1.
The endpoint's declaration looks like this:

  <http:consumer service="b:http"
                 endpoint="endpoint"
                 targetService="b:xslt"
                 locationURI="http://0.0.0.0:8192/bridge/"
                 defaultMep="http://www.w3.org/2004/08/wsdl/in-out" />

I think the problem is in this piece of code extracted from
org.apache.servicemix.http.endpoints.HttpConsumerEndpoint:

322:    public void process(HttpServletRequest request,
HttpServletResponse response) throws Exception {
...
339:          final Object mutex = getOrCreateMutex(exchange);
340:
341:          // Synchronize on the mutex object while we're tinkering
with the continuation object
342:          synchronized (mutex) {
343:            if (isNewContinuation(continuation)) {
...
361:                    // Send the exchange and then suspend the HTTP
request until the message exchange gets answered
362:                    send(exchange);
...
372:                boolean istimeout = !continuation.suspend(to);
373:
374:          // Continuation is being ended (either because the
message exchange was handled or the continuation timed out)
375:                // Cleaning up the stored objects for this continuation now
376:                exchange = doEndContinuation(continuation);
377:
378:                // Throw exception when HTTP time-out has occurred
379:                if (istimeout) {
380:                    throw new HttpTimeoutException(exchange);
381:                }
382:          }

Here the continuation is suspended inside the synchorized block using
the exchange as lock object. By the other side, the release() is sent
to the continuation in the following method which processes the
exchange's result:

282: public void process(MessageExchange exchange) throws Exception {
283:    final String id = exchange.getExchangeId();
283:    final Object mutex = mutexes.get(id);
...
293:    synchronized (mutex) {
294:      final Continuation continuation = continuations.get(id);
...
301:      continuation.resume();
...
313:    }

The resume() method is called inside another synchrozed block using
the same object as lock, so the sequence is:
 - lock over mutex starts
 - continuation is suspended until its timeout
 - lock over mutex ends
 - the code inside the method which processes the exchange's result
gets control.
I think the point is that it always gets control after timeout occurs.
I made the tests on smx 3.3.2, http component 2009.01 (it works) and
on smx 3.4.0, http
component 2011.02 (timeout issue). In both cases I used the managed
servlet of the web distribution running on tomcat. The standalone
distribution using jetty connector work fine.

Thanks in advance,
Hernan

Re: servicemix-http-2011.02 timeout issue using managed servlet

Posted by Matias Urbieta <ma...@fluxit.com.ar>.
Hi, Should we rise a ticket about this issue?
thanks

2012/2/6 Hernan Sigliani <he...@fluxit.com.ar>

> Probably a solution could be using the same lock object both in the
> continuation as in the synchronized blocks:
>
> @@ -334,9 +334,9 @@
>                  to = ((HttpComponent)
>
> getServiceUnit().getComponent()).getConfiguration().getConsumerProcessorSuspendTime();
>              }
>
> -            final Continuation continuation =
> ContinuationSupport.getContinuation(request, null);
> +            final Object mutex = getOrCreateMutex(exchange);
> +            final Continuation continuation =
> ContinuationSupport.getContinuation(request, mutex);
>              exchange = (MessageExchange) continuation.getObject();
> -            final Object mutex = getOrCreateMutex(exchange);
>
>              // Synchronize on the mutex object while we're tinkering
> with the continuation object
>              synchronized (mutex) {
>
> Please tell me what you think about that.
> Thanks,
>
> Hernán.
>
> On Fri, Feb 3, 2012 at 2:57 PM, Hernan Sigliani
> <he...@fluxit.com.ar> wrote:
> > Hi,
> >    I'm currently working on the testing of the compatibility of our
> > services developed for smx 3.3.2 on the new 3.4.0 platform, since we
> > are thinking upgrade to that version.
> > I found an issue in the http:consumer component (2011.02) that makes
> > all http requests get a timeout exception. That is not happening in
> > previous versions such as 2009.1.
> > The endpoint's declaration looks like this:
> >
> >  <http:consumer service="b:http"
> >                 endpoint="endpoint"
> >                 targetService="b:xslt"
> >                 locationURI="http://0.0.0.0:8192/bridge/"
> >                 defaultMep="http://www.w3.org/2004/08/wsdl/in-out" />
> >
> > I think the problem is in this piece of code extracted from
> > org.apache.servicemix.http.endpoints.HttpConsumerEndpoint:
> >
> > 322:    public void process(HttpServletRequest request,
> > HttpServletResponse response) throws Exception {
> > ...
> > 339:          final Object mutex = getOrCreateMutex(exchange);
> > 340:
> > 341:          // Synchronize on the mutex object while we're tinkering
> > with the continuation object
> > 342:          synchronized (mutex) {
> > 343:            if (isNewContinuation(continuation)) {
> > ...
> > 361:                    // Send the exchange and then suspend the HTTP
> > request until the message exchange gets answered
> > 362:                    send(exchange);
> > ...
> > 372:                boolean istimeout = !continuation.suspend(to);
> > 373:
> > 374:          // Continuation is being ended (either because the
> > message exchange was handled or the continuation timed out)
> > 375:                // Cleaning up the stored objects for this
> continuation now
> > 376:                exchange = doEndContinuation(continuation);
> > 377:
> > 378:                // Throw exception when HTTP time-out has occurred
> > 379:                if (istimeout) {
> > 380:                    throw new HttpTimeoutException(exchange);
> > 381:                }
> > 382:          }
> >
> > Here the continuation is suspended inside the synchorized block using
> > the exchange as lock object. By the other side, the release() is sent
> > to the continuation in the following method which processes the
> > exchange's result:
> >
> > 282: public void process(MessageExchange exchange) throws Exception {
> > 283:    final String id = exchange.getExchangeId();
> > 283:    final Object mutex = mutexes.get(id);
> > ...
> > 293:    synchronized (mutex) {
> > 294:      final Continuation continuation = continuations.get(id);
> > ...
> > 301:      continuation.resume();
> > ...
> > 313:    }
> >
> > The resume() method is called inside another synchrozed block using
> > the same object as lock, so the sequence is:
> >  - lock over mutex starts
> >  - continuation is suspended until its timeout
> >  - lock over mutex ends
> >  - the code inside the method which processes the exchange's result
> > gets control.
> > I think the point is that it always gets control after timeout occurs.
> > I made the tests on smx 3.3.2, http component 2009.01 (it works) and
> > on smx 3.4.0, http
> > component 2011.02 (timeout issue). In both cases I used the managed
> > servlet of the web distribution running on tomcat. The standalone
> > distribution using jetty connector work fine.
> >
> > Thanks in advance,
> > Hernan
>



-- 

Lic. Mario Matias Urbieta
matias.urbieta@fluxit.com.ar
www.fluxit.com.ar Calle 9 #865
La Plata / Buenos Aires / Argentina
+54 221 4831722 Int:308

Re: servicemix-http-2011.02 timeout issue using managed servlet

Posted by Hernan Sigliani <he...@fluxit.com.ar>.
Probably a solution could be using the same lock object both in the
continuation as in the synchronized blocks:

@@ -334,9 +334,9 @@
                 to = ((HttpComponent)
getServiceUnit().getComponent()).getConfiguration().getConsumerProcessorSuspendTime();
             }

-            final Continuation continuation =
ContinuationSupport.getContinuation(request, null);
+            final Object mutex = getOrCreateMutex(exchange);
+            final Continuation continuation =
ContinuationSupport.getContinuation(request, mutex);
             exchange = (MessageExchange) continuation.getObject();
-            final Object mutex = getOrCreateMutex(exchange);

             // Synchronize on the mutex object while we're tinkering
with the continuation object
             synchronized (mutex) {

Please tell me what you think about that.
Thanks,

Hernán.

On Fri, Feb 3, 2012 at 2:57 PM, Hernan Sigliani
<he...@fluxit.com.ar> wrote:
> Hi,
>    I'm currently working on the testing of the compatibility of our
> services developed for smx 3.3.2 on the new 3.4.0 platform, since we
> are thinking upgrade to that version.
> I found an issue in the http:consumer component (2011.02) that makes
> all http requests get a timeout exception. That is not happening in
> previous versions such as 2009.1.
> The endpoint's declaration looks like this:
>
>  <http:consumer service="b:http"
>                 endpoint="endpoint"
>                 targetService="b:xslt"
>                 locationURI="http://0.0.0.0:8192/bridge/"
>                 defaultMep="http://www.w3.org/2004/08/wsdl/in-out" />
>
> I think the problem is in this piece of code extracted from
> org.apache.servicemix.http.endpoints.HttpConsumerEndpoint:
>
> 322:    public void process(HttpServletRequest request,
> HttpServletResponse response) throws Exception {
> ...
> 339:          final Object mutex = getOrCreateMutex(exchange);
> 340:
> 341:          // Synchronize on the mutex object while we're tinkering
> with the continuation object
> 342:          synchronized (mutex) {
> 343:            if (isNewContinuation(continuation)) {
> ...
> 361:                    // Send the exchange and then suspend the HTTP
> request until the message exchange gets answered
> 362:                    send(exchange);
> ...
> 372:                boolean istimeout = !continuation.suspend(to);
> 373:
> 374:          // Continuation is being ended (either because the
> message exchange was handled or the continuation timed out)
> 375:                // Cleaning up the stored objects for this continuation now
> 376:                exchange = doEndContinuation(continuation);
> 377:
> 378:                // Throw exception when HTTP time-out has occurred
> 379:                if (istimeout) {
> 380:                    throw new HttpTimeoutException(exchange);
> 381:                }
> 382:          }
>
> Here the continuation is suspended inside the synchorized block using
> the exchange as lock object. By the other side, the release() is sent
> to the continuation in the following method which processes the
> exchange's result:
>
> 282: public void process(MessageExchange exchange) throws Exception {
> 283:    final String id = exchange.getExchangeId();
> 283:    final Object mutex = mutexes.get(id);
> ...
> 293:    synchronized (mutex) {
> 294:      final Continuation continuation = continuations.get(id);
> ...
> 301:      continuation.resume();
> ...
> 313:    }
>
> The resume() method is called inside another synchrozed block using
> the same object as lock, so the sequence is:
>  - lock over mutex starts
>  - continuation is suspended until its timeout
>  - lock over mutex ends
>  - the code inside the method which processes the exchange's result
> gets control.
> I think the point is that it always gets control after timeout occurs.
> I made the tests on smx 3.3.2, http component 2009.01 (it works) and
> on smx 3.4.0, http
> component 2011.02 (timeout issue). In both cases I used the managed
> servlet of the web distribution running on tomcat. The standalone
> distribution using jetty connector work fine.
>
> Thanks in advance,
> Hernan