You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by "Sylvain Laurent (JIRA)" <ji...@apache.org> on 2010/08/09 09:58:16 UTC
[jira] Created: (HTTPCLIENT-976) (v3.x) Deadlock in case of
concurrent calls to MultiThreadedHttpConnectionManager.shutdown and
shutdownAll
(v3.x) Deadlock in case of concurrent calls to MultiThreadedHttpConnectionManager.shutdown and shutdownAll
----------------------------------------------------------------------------------------------------------
Key: HTTPCLIENT-976
URL: https://issues.apache.org/jira/browse/HTTPCLIENT-976
Project: HttpComponents HttpClient
Issue Type: Bug
Affects Versions: 3.1 Final
Reporter: Sylvain Laurent
Fix For: 3.1.1
There's a concurrency issue in MultiThreadedHttpConnectionManager in case 2 threads call shutdown and shutdownAll in parallel.
Let's say Thread A calls shutdownAll (which is static) and Thread B calls shutdown (on an instance M of MultiThreadedHttpConnectionManager ).
Here is an example of a deadlock :
- Thread A enters shutdownAll and acquires lock on REFERENCE_TO_CONNECTION_SOURCE and ALL_CONNECTION_MANAGERS
- Thread B enters shutdown for instance M and acquires lock on M (shutdown is synchronized) and its connectionPool and
- inside shutdownAll Thread A tries to call shutdown on M
- Thread A waits for lock on M (currently held by B)
- Thread B continues and calls shutdownCheckedOutConnections which tries to acquire lock on REFERENCE_TO_CONNECTION_SOURCE, currently held by thread A
--> DEADLOCK !
Here is a stacktrace for version 3.0.1 (but the bug seems to be in 3.1 too) :
{code}
"Thread-2":
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdown(MultiThreadedHttpConnectionManager.java:266)
- waiting to lock <0x030dc020> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdownAll(MultiThreadedHttpConnectionManager.java:120)
- locked <0x030db0e0> (a java.util.WeakHashMap)
- locked <0x030db0a0> (a java.util.HashMap)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:273)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:199)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:487)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:463)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:431)
- locked <0x03149a08> (a java.util.LinkedHashMap)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1048)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1022)
at org.springframework.context.support.AbstractApplicationContext$3.run(AbstractApplicationContext.java:940)
"Thread-1":
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdownCheckedOutConnections(MultiThreadedHttpConnectionManager.java:186)
- waiting to lock <0x030db0a0> (a java.util.HashMap)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.access$600(MultiThreadedHttpConnectionManager.java:64)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool.shutdown(MultiThreadedHttpConnectionManager.java:713)
- locked <0x030dd4b8> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdown(MultiThreadedHttpConnectionManager.java:269)
- locked <0x030dd4b8> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool)
- locked <0x030dc020> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:273)
at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:199)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:487)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:463)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:498)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:463)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:431)
- locked <0x02cf9810> (a java.util.LinkedHashMap)
at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1048)
at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1022)
at org.springframework.context.support.AbstractApplicationContext$3.run(AbstractApplicationContext.java:940)
{code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org
[jira] Resolved: (HTTPCLIENT-976) (v3.x) Deadlock in case of
concurrent calls to MultiThreadedHttpConnectionManager.shutdown and
shutdownAll
Posted by "Oleg Kalnichevski (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/HTTPCLIENT-976?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Oleg Kalnichevski resolved HTTPCLIENT-976.
------------------------------------------
Fix Version/s: (was: 3.1.1)
Resolution: Won't Fix
3.x code line is at the end of life and is no longer being developed. Please consider upgrading to 4.x.
Oleg
> (v3.x) Deadlock in case of concurrent calls to MultiThreadedHttpConnectionManager.shutdown and shutdownAll
> ----------------------------------------------------------------------------------------------------------
>
> Key: HTTPCLIENT-976
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-976
> Project: HttpComponents HttpClient
> Issue Type: Bug
> Affects Versions: 3.1 Final
> Reporter: Sylvain Laurent
>
> There's a concurrency issue in MultiThreadedHttpConnectionManager in case 2 threads call shutdown and shutdownAll in parallel.
> Let's say Thread A calls shutdownAll (which is static) and Thread B calls shutdown (on an instance M of MultiThreadedHttpConnectionManager ).
> Here is an example of a deadlock :
> - Thread A enters shutdownAll and acquires lock on REFERENCE_TO_CONNECTION_SOURCE and ALL_CONNECTION_MANAGERS
> - Thread B enters shutdown for instance M and acquires lock on M (shutdown is synchronized) and its connectionPool and
> - inside shutdownAll Thread A tries to call shutdown on M
> - Thread A waits for lock on M (currently held by B)
> - Thread B continues and calls shutdownCheckedOutConnections which tries to acquire lock on REFERENCE_TO_CONNECTION_SOURCE, currently held by thread A
> --> DEADLOCK !
> Here is a stacktrace for version 3.0.1 (but the bug seems to be in 3.1 too) :
> {code}
> "Thread-2":
> at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdown(MultiThreadedHttpConnectionManager.java:266)
> - waiting to lock <0x030dc020> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager)
> at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdownAll(MultiThreadedHttpConnectionManager.java:120)
> - locked <0x030db0e0> (a java.util.WeakHashMap)
> - locked <0x030db0a0> (a java.util.HashMap)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:273)
> at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:199)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:487)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:463)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:431)
> - locked <0x03149a08> (a java.util.LinkedHashMap)
> at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1048)
> at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1022)
> at org.springframework.context.support.AbstractApplicationContext$3.run(AbstractApplicationContext.java:940)
> "Thread-1":
> at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdownCheckedOutConnections(MultiThreadedHttpConnectionManager.java:186)
> - waiting to lock <0x030db0a0> (a java.util.HashMap)
> at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.access$600(MultiThreadedHttpConnectionManager.java:64)
> at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool.shutdown(MultiThreadedHttpConnectionManager.java:713)
> - locked <0x030dd4b8> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool)
> at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager.shutdown(MultiThreadedHttpConnectionManager.java:269)
> - locked <0x030dd4b8> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool)
> - locked <0x030dc020> (a org.apache.commons.httpclient.MultiThreadedHttpConnectionManager)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:273)
> at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:199)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:487)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:463)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:498)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:463)
> at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:431)
> - locked <0x02cf9810> (a java.util.LinkedHashMap)
> at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1048)
> at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1022)
> at org.springframework.context.support.AbstractApplicationContext$3.run(AbstractApplicationContext.java:940)
> {code}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org