There is still some inconsistencies between how ServiceClient#sendReceive
and Operation#execute use Options#getCallTransportCleanup.

And I think that would help a lot if the related jira issues get cleaned up
a little bit.

Thanks for your time and feedback.

Alexis


On Sun, Mar 1, 2009 at 9:02 PM, Amila Suriarachchi <
amilasuriarach...@gmail.com> wrote:

> hi all,
>
> On Fri, Feb 27, 2009 at 6:35 PM, Andreas Veithen <
> andreas.veit...@gmail.com> wrote:
>
>> I think that callTransportCleanup should never be turned on by default
>> because it would disable deferred parsing of the response. What needs
>> to be done urgently is to improve the documentation of the
>> ServiceClient class to make it clear that it is mandatory to either
>> call cleanupTransport explicitly or to set callTransportCleanup to
>> true. Also the cleanupTransport method itself doesn't have any
>> Javadoc.
>
>
> thanks for in-depth analysing  of this issue. If the issue is not calling
> to transport clean up then I clearly agree with what Andreas.
>
> Axis2 uses deffered building. There when the user gets the response
> OMElement it has not build and Axis2 does not know when he going to finish
> with it. So it is responsibility of the user to call the transport clean up
> once they have done with the OMElement.
>
> But this problem does not occur with the generated data bind code. There
> before returning from the stub method it generates the all the databinding
> classes. In the generated code finally method calls
> _messageContext.getTransportOut().getSender().cleanup(_messageContext);
>
> to clean up the transport.
>
> thanks,
> Amila.
>
>>
>> Andreas
>>
>> On Fri, Feb 27, 2009 at 12:19, Dobri Kitipov
>> <kdobrik.ax...@googlemail.com> wrote:
>> > Hi Andreas,
>> > thank you for the comment. I think you get the question.
>> > Quick test shows that setting the following line of code into the
>> client:
>> >
>> > options.setCallTransportCleanup(true);
>> >
>> > forces the closure of the http connection. It seems it is not the
>> default
>> > behavior. This is a good and fast solution. I was a little bit more
>> focused
>> > on wondering why I have such a difference b/n using SOAP and MIME
>> builder.
>> >
>> > I need to think about some use cases when we need to have
>> > options.setCallTransportCleanup(false). Can we have this by default in
>> some
>> > cases?
>> >
>> > Anyway, it will be worth having a further analysis of the issue we have
>> with
>> > SOAPBuilder behavior.
>> >
>> > Thank you,
>> > Dobri
>> >
>> >
>> > On Fri, Feb 27, 2009 at 12:46 PM, Andreas Veithen
>> > <andreas.veit...@gmail.com> wrote:
>> >>
>> >> If I understand correctly, Dobri's findings can be summarized as
>> follows:
>> >> 1. Once the InputStream is consumed, commons-httpclient automatically
>> >> releases the connection.
>> >> 2. SOAPBuilder never completely consumes the InputStream.
>> >>
>> >> The SOAPBuilder behavior is indeed somewhat questionable, but it is
>> >> important to understand that because of the deferred parsing model
>> >> used by Axiom, there is never a guarantee that the InputStream will be
>> >> completely consumed. Normally releasing the connection is the
>> >> responsibility of the CommonsHTTPTransportSender#cleanup method which
>> >> should be called by ServiceClient#cleanupTransport. It would be
>> >> interesting to know if that method is called, and if it is, why it
>> >> fails to release the connection.
>> >>
>> >> Andreas
>> >>
>> >> On Fri, Feb 27, 2009 at 10:10, Dobri Kitipov
>> >> <kdobrik.ax...@googlemail.com> wrote:
>> >> > Hi all,
>> >> > I have observed absolutely the same thing these days. I need some
>> more
>> >> > time
>> >> > to analyze the whole picture, but here is my current synthesis of the
>> >> > issue.
>> >> >
>> >> > It seems that http connection release is tightly coupled  with the
>> Axis2
>> >> > builder used to handle and process the response body and the
>> >> > corresponding
>> >> > input streams used. The builder and the InputStream used are based on
>> >> > the
>> >> > HTTP headers fields like "Content-Type" and "Transfer-Encoding" (e.g.
>> >> > Content-Type: text/xml; charset=UTF-8  Transfer-Encoding: chunked).
>> So
>> >> > if we
>> >> > have Content-Type: text/xml; then SOAPBuilder class will be used. If
>> we
>> >> > have  type="application/xop+xml" then MIMEBuilder will be used.
>> >> >
>> >> > The successfull story when we have MIMIBuilder:
>> >> >
>> >> > When MIMEBuilder is used then the response Buffered InputStream (IS)
>> is
>> >> > wrrapped (I will use "->" sign as substitution for wrrapped)
>> ChunkedIS
>> >> > ->
>> >> > AutoCloseIS (this has a responseConsumed() method notified when
>> >> > IS.read()
>> >> > returns -1, which means that the response IS has been completely
>> read)
>> >> > ->
>> >> > PushBackIS ->BounderyPushBackIS. The BounderyPushBackIS reads the
>> >> > response
>> >> > stream (see readFromStream(....)) in a cycle till it reaches its end.
>> At
>> >> > every iteration of this cycle a AutoCloseIS checkClose(l) is invoked.
>> So
>> >> > when the end is reached (-1 is returned) then this check causes the
>> >> > invokation of the AutoCloseIS checkClose(...)  method. This method
>> >> > invokes
>> >> > notifyWatcher() that in turn invokes responseBodyConsumed() method of
>> >> > the
>> >> > HttpMethodBase class. This causes the release of the http connection
>> >> > which
>> >> > is returned back to the connection pool. So here we have no problem
>> with
>> >> > connection reuse.
>> >> >
>> >> > The bad story we have with SOAPBuilder:
>> >> >
>> >> > When SOAPBuilder is used then the response Buffered InputStream is
>> >> > wrrapped
>> >> > in a ChunkedIS -> AutoCloseIS -> PushBackIS. May be you has noticed
>> that
>> >> > BounderyPushBackIS is not used. As a result the respose IS is not
>> >> > completely
>> >> > read (in fact this is not really correct, it could be read but the
>> >> > invokation of the PushBackIS unread(...) method causes the
>> AutoCloseIS
>> >> > checkClose() method never to return -1). As a result the http
>> connection
>> >> > is
>> >> > not released. And since there is a limit to have 2 connection per
>> host
>> >> > then after the second invokation of the WS client the thread hangs
>> >> > waiting
>> >> > for a free connection.
>> >> >
>> >> > Please, provide us with your comments on this issue.
>> >> >
>> >> > Thank you in advance.
>> >> >
>> >> > Regards,
>> >> > Dobri
>> >> >
>> >> > On Fri, Feb 27, 2009 at 3:54 AM, Alexis Midon <mi...@intalio.com>
>> wrote:
>> >> >>
>> >> >> no taker for an easy patch?
>> >> >>
>> >> >> Alexis
>> >> >>
>> >> >>
>> >> >> On Wed, Feb 25, 2009 at 6:45 PM, Alexis Midon <mi...@intalio.com>
>> >> >> wrote:
>> >> >>>
>> >> >>> Hi everyone,
>> >> >>>
>> >> >>> All the issues relatives to AXIS2-935 are really messy, some of
>> them
>> >> >>> are
>> >> >>> closed but their clones are not. Some are flagged as fixed but are
>> >> >>> obviously
>> >> >>> not. All these issues are really old, so I'd like to take a chance
>> to
>> >> >>> bring
>> >> >>> them back to your attention, especially before releasing 1.5.
>> >> >>>
>> >> >>> I'll post a description of the issue in this email as a summary all
>> >> >>> the
>> >> >>> jiras.
>> >> >>>
>> >> >>> By default, ServiceClient uses one HttpConnectionManager per
>> >> >>> invocation
>> >> >>> [2]. This connection manager will create and provide one connection
>> to
>> >> >>> HTTPSender. The first issue is that by default this connection is
>> >> >>> never
>> >> >>> released to the pool [3]. if you do zillions of invocations, this
>> leak
>> >> >>> will
>> >> >>> max out your number of file descriptors.
>> >> >>>
>> >> >>> Your investigations in Axis2 options quickly lead you to the
>> >> >>> REUSE_HTTP_CLIENT option. But this first issue has some unfortunate
>> >> >>> consequences if you activate it. Actually if you do so, a single
>> >> >>> connection
>> >> >>> manager is shared across all invocations. But because connections
>> are
>> >> >>> not
>> >> >>> release, the pool is starved after two invocations, and the third
>> >> >>> invocation
>> >> >>> hangs out indefinitely. :(
>> >> >>>
>> >> >>> If you keep digging you will find the AUTO_RELEASE_CONNECTION
>> option.
>> >> >>> Its
>> >> >>> sounds like a good lead! Let's try it. If you activate this option
>> the
>> >> >>> connection is properly released -Yahoooo! the leak is fixed - but
>> >> >>> unfortunately a new issue shows up (issue #2, aka AXIS2-3478).
>> >> >>> AbstractHTTPSender passes the stream of the connection to the
>> message
>> >> >>> context [4] , but that the connection is now properly released, so
>> >> >>> this
>> >> >>> stream is closed before the SOAPBuilder gets a chance to read the
>> >> >>> response
>> >> >>> body.
>> >> >>> Boom! "IOException: Attempted read on closed stream"
>> >> >>>
>> >> >>> These issues are easily reproducible in versions 1.3, 1.4, 1.5.
>> >> >>>
>> >> >>> I submitted and documented a fix in AXIS2-2931 [5], if you had a
>> >> >>> chance
>> >> >>> to look at it that would be much appreciate.
>> >> >>>
>> >> >>>
>> >> >>> Alexis
>> >> >>>
>> >> >>>
>> >> >>> [1]
>> >> >>>
>> >> >>>
>> https://issues.apache.org/jira/browse/AXIS2-935?focusedCommentId=12513543#action_12513543
>> >> >>> [2] see method getHttpClient in
>> >> >>>
>> >> >>>
>> https://svn.apache.org/repos/asf/webservices/commons/trunk/modules/transport/modules/http/src/org/apache/axis2/transport/http/AbstractHTTPSender.java
>> >> >>> [3] see method cleanup in
>> >> >>>
>> >> >>>
>> https://svn.apache.org/repos/asf/webservices/commons/trunk/modules/transport/modules/http/src/org/apache/axis2/transport/http/HTTPSender.java
>> >> >>> [4] see method processResponse in AbstractHTTPSender.java
>> >> >>> [5]
>> >> >>>
>> >> >>>
>> https://issues.apache.org/jira/browse/AXIS2-2931?focusedCommentId=12676837#action_12676837
>> >> >>
>> >> >
>> >> >
>> >
>> >
>>
>
>
>
> --
> Amila Suriarachchi
> WSO2 Inc.
> blog: http://amilachinthaka.blogspot.com/
>

Reply via email to