[ 
https://issues.apache.org/jira/browse/HTTPASYNC-56?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13792449#comment-13792449
 ] 

Dmitry Potapov commented on HTTPASYNC-56:
-----------------------------------------

Here the piece of javacore.txt gerenated by JVM:
{noformat}
3XMTHREADINFO      "Thread A" J9VMThread:0x00000000027E0200, 
j9thread_t:0x00007FC3E9C28770, java/lang/Thread:0x00000000144528A0, state:B, 
prio=5
3XMJAVALTHREAD            (java/lang/Thread getId:0x1AE, isDaemon:false)
3XMTHREADINFO1            (native thread ID:0x4772, native priority:0x5, native 
policy:UNKNOWN)
3XMTHREADINFO2            (native stack address range from:0x00007FC398004000, 
to:0x00007FC398045000, size:0x41000)
3XMTHREADBLOCK     Blocked on: 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl@0x000000027AD591B0
 Owned by: "Thread B" (J9VMThread:0x000000000369E600, 
java/lang/Thread:0x00000000161F38E0)
3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)
3XMTHREADINFO3           Java callstack:
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.connectionAllocated(DefaultClientExchangeHandlerImpl.java:266(Compiled
 Code))
5XESTACKTRACE                   (entered lock: 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl@0x000000027AD591B0,
 entry count: 1)
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.access$000(DefaultClientExchangeHandlerImpl.java:57(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl$1.completed(DefaultClientExchangeHandlerImpl.java:333(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl$1.completed(DefaultClientExchangeHandlerImpl.java:340(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/concurrent/BasicFuture.completed(BasicFuture.java:115(Compiled 
Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager$InternalPoolEntryCallback.completed(PoolingNHttpClientConnectionManager.java:439(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager$InternalPoolEntryCallback.completed(PoolingNHttpClientConnectionManager.java:423(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/concurrent/BasicFuture.completed(BasicFuture.java:115(Compiled 
Code))
4XESTACKTRACE                at 
org/apache/http/nio/pool/AbstractNIOConnPool.fireCallbacks(AbstractNIOConnPool.java:443(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/nio/pool/AbstractNIOConnPool.lease(AbstractNIOConnPool.java:276(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/nio/pool/AbstractNIOConnPool.lease(AbstractNIOConnPool.java:248(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.requestConnection(PoolingNHttpClientConnectionManager.java:239(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.requestConnection(DefaultClientExchangeHandlerImpl.java:326(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.start(DefaultClientExchangeHandlerImpl.java:120(Compiled
 Code))
5XESTACKTRACE                   (entered lock: 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl@0x0000000311DD8EA0,
 entry count: 1)
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:188(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:63(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:93(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:78(Compiled
 Code))
...
3XMTHREADINFO      "Thread B" J9VMThread:0x000000000369E600, 
j9thread_t:0x00007FC3EA6100B0, java/lang/Thread:0x00000000161F38E0, state:B, 
prio=5
3XMJAVALTHREAD            (java/lang/Thread getId:0x486, isDaemon:false)
3XMTHREADINFO1            (native thread ID:0x4A4A, native priority:0x5, native 
policy:UNKNOWN)
3XMTHREADINFO2            (native stack address range from:0x00007FC2FC65D000, 
to:0x00007FC2FC69E000, size:0x41000)
3XMTHREADBLOCK     Blocked on: 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl@0x0000000311DD8EA0
 Owned by: "Thread A" (J9VMThread:0x00000000027E0200, 
java/lang/Thread:0x00000000144528A0)
3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)
3XMTHREADINFO3           Java callstack:
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.connectionAllocated(DefaultClientExchangeHandlerImpl.java:266(Compiled
 Code))
5XESTACKTRACE                   (entered lock: 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl@0x0000000311DD8EA0,
 entry count: 1)
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.access$000(DefaultClientExchangeHandlerImpl.java:57(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl$1.completed(DefaultClientExchangeHandlerImpl.java:333(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl$1.completed(DefaultClientExchangeHandlerImpl.java:340(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/concurrent/BasicFuture.completed(BasicFuture.java:115(Compiled 
Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager$InternalPoolEntryCallback.completed(PoolingNHttpClientConnectionManager.java:439(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager$InternalPoolEntryCallback.completed(PoolingNHttpClientConnectionManager.java:423(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/concurrent/BasicFuture.completed(BasicFuture.java:115(Compiled 
Code))
4XESTACKTRACE                at 
org/apache/http/nio/pool/AbstractNIOConnPool.fireCallbacks(AbstractNIOConnPool.java:443(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/nio/pool/AbstractNIOConnPool.lease(AbstractNIOConnPool.java:276(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/nio/pool/AbstractNIOConnPool.lease(AbstractNIOConnPool.java:248(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/conn/PoolingNHttpClientConnectionManager.requestConnection(PoolingNHttpClientConnectionManager.java:239(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.requestConnection(DefaultClientExchangeHandlerImpl.java:326(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl.start(DefaultClientExchangeHandlerImpl.java:120(Compiled
 Code))
5XESTACKTRACE                   (entered lock: 
org/apache/http/impl/nio/client/DefaultClientExchangeHandlerImpl@0x000000027AD591B0,
 entry count: 1)
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:188(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:63(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:93(Compiled
 Code))
4XESTACKTRACE                at 
org/apache/http/impl/nio/client/CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:78(Compiled
 Code))
{noformat}

> Deadlock in DefaultClientExchangeHandlerImpl.start()
> ----------------------------------------------------
>
>                 Key: HTTPASYNC-56
>                 URL: https://issues.apache.org/jira/browse/HTTPASYNC-56
>             Project: HttpComponents HttpAsyncClient
>          Issue Type: Bug
>    Affects Versions: 4.0-beta4
>            Reporter: Dmitry Potapov
>             Fix For: 4.0 Final
>
>
> How it looks like:
> 1. Theads A and B calls CloseableHttpAsyncClient.execute() of the same 
> CloseableHttpAsyncClient (problem may reproduce on two separate clients 
> sharing single connection pool)
> 2. Each CloseableHttpAsyncClient.execute in turn calls 
> InternalHttpAsyncClient.execute() which creates 
> DefaultClientExchangeHandlerImpl instance and calls 
> DefaultClientExchangeHandlerImpl.start(), which is synchronized
> 3. At this point, we have two DefaultClientExchangeHandlerImpl with locked 
> monitors, let these instances have names AH and BH.
> 4. DefaultClientExchangeHandlerImpl.start() calls requestConnection(), which 
> in turn calls PoolingNHttpClientConnectionManager.requestConnection()
> 5. At thread A: AbstractNIOConnPool.lease() adds completed request to the 
> completedRequests queue (line 271). This request callback has reference to 
> the AH
> 6. At thread B: AbstractNIOConnPool.lease() adds completed request to the 
> completedRequests queue. This request callback has reference to BH
> 7. At thread B: AbstractNIOConnPool.fireCallbacks() is called. It polls AH 
> from completedRequests and calls AH callback, which tries to enter AH monitor 
> and locks, because this monitor is already locked.
> 8. At thread A: AbstractNIOConnPool.fireCallbacks() is called. It polls BH 
> from completedRequests (AH was polled at step 7) and calls BH callback, which 
> tries to enter BH monitor and locks, because this monitor is already locked.
> At this point we have threads A and B deadlocked.
> I have obvious solution for this particular dead-lock: make 
> DefaultClientExchangeHandlerImpl.start() not synchronized, because this 
> object created only at single point, and .start() is called immediately after 
> construction.
> I'm not sure that there is no problems in other scenarious where 
> .fireCallbacks() involved, because 
> DefaultClientExchangeHandlerImpl.requestConnection() may be called from other 
> synchronized methods.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to