I added some Javadoc explaining the role of cleanupTransport (see revision 748730).
Andreas On Fri, Feb 27, 2009 at 14:05, 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. > > 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 >>> >> >>> > >>> > >> >> >