hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Oleg Kalnichevski <ol...@apache.org>
Subject Re: HttpUriRequest.abort - race condition with ThreadSafeClientConnManager.releaseConnection
Date Wed, 14 Oct 2009 20:26:13 GMT
On Wed, 2009-10-14 at 11:42 -0400, Boemker, Tim wrote:
> If HttpUriRequest.abort() is called at about the same time that the
> request completes, it's possible for an aborted connection to be
> returned to the pool.  The next time the connection is used,
> HttpClient.execute fails without retrying, throwing this exception:
> 
> java.io.IOException: Connection already shutdown
> 	at
> org.apache.http.impl.conn.DefaultClientConnection.opening(DefaultClientC
> onnection.java:112)
> 	at
> org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection
> (DefaultClientConnectionOperator.java:120)
> 	at
> org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:
> 147)
> 	at
> org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledC
> onnAdapter.java:101)
> 	at
> org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultReques
> tDirector.java:381)
> 	at
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClien
> t.java:641)
> 	at
> org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClien
> t.java:576)
> 
> Steps to reproduce:
> 1) Set a breakpoint in ThreadSafeClientConnManager.releaseConnection
> just after "reusable" is set (and found to be true).
> 2) Run to the breakpoint in releaseConnection.
> 3) Call HttpUriRequest.abort.
> 4) Let releaseConnection complete.
> 
> When the connection is next used, the exception will be thrown.
> 
> Snippet from ThreadSafeClientConnManager:
>     public void releaseConnection(ManagedClientConnection conn, long
> validDuration, TimeUnit timeUnit) {
> 		...
>             boolean reusable = hca.isMarkedReusable();
>             if (log.isDebugEnabled()) {                             //
> breakpoint here
>                 if (reusable) {
>                     log.debug("Released connection is reusable.");
>                 } else {
>                     log.debug("Released connection is not reusable.");
>                 }
>             }
>             hca.detach();
>             if (entry != null) {
>                 connectionPool.freeEntry(entry, reusable, validDuration,
> timeUnit);
>             }
>         }
>     }
> 
> I read the contract of ConnectionReleaseTrigger to say that only the
> first call of either method has effect so that, for example, a call to
> abortConnection made after a call to releaseConnection would be ignored,
> but I don't think that's the way AbstractClientConnAdapter is
> implemented; I think that it's possible for both methods to have effect.
> 
> Am I looking at this correctly?
> 

Yes, you are. Obviously this is a bug that needs fixing. Could you
please raise a JIRA for this defect? A patch would also be quite
welcome.

https://issues.apache.org/jira/browse/HTTPCLIENT

Oleg


> Thanks for your consideration.
> 
> Tim
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
> For additional commands, e-mail: dev-help@hc.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org


Mime
View raw message