This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 47adfd0  Merge pull request #1836, there is a potential deadlock in 
DubboProtocol#getSharedClient.
47adfd0 is described below

commit 47adfd047b2df5ab2f5ca9740e85676ce53066f9
Author: Ian Luo <[email protected]>
AuthorDate: Fri May 25 10:11:07 2018 +0800

    Merge pull request #1836, there is a potential deadlock in 
DubboProtocol#getSharedClient.
    
    Fixes #677.
---
 .../com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java    | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java
index 4e8b971..017e4a9 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboProtocol.java
@@ -65,6 +65,7 @@ public class DubboProtocol extends AbstractProtocol {
     private final Map<String, ExchangeServer> serverMap = new 
ConcurrentHashMap<String, ExchangeServer>(); // <host:port,Exchanger>
     private final Map<String, ReferenceCountExchangeClient> referenceClientMap 
= new ConcurrentHashMap<String, ReferenceCountExchangeClient>(); // 
<host:port,Exchanger>
     private final ConcurrentMap<String, LazyConnectExchangeClient> 
ghostClientMap = new ConcurrentHashMap<String, LazyConnectExchangeClient>();
+    private final ConcurrentMap<String, Object> locks = new 
ConcurrentHashMap<String, Object>();
     private final Set<String> optimizers = new ConcurrentHashSet<String>();
     //consumer side export a stub service for dispatching event
     //servicekey-stubmethods
@@ -373,11 +374,18 @@ public class DubboProtocol extends AbstractProtocol {
                 referenceClientMap.remove(key);
             }
         }
-        synchronized (key.intern()) {
+
+        locks.putIfAbsent(key, new Object());
+        synchronized (locks.get(key)) {
+            if (referenceClientMap.containsKey(key)) {
+                return referenceClientMap.get(key);
+            }
+
             ExchangeClient exchangeClient = initClient(url);
             client = new ReferenceCountExchangeClient(exchangeClient, 
ghostClientMap);
             referenceClientMap.put(key, client);
             ghostClientMap.remove(key);
+            locks.remove(key);
             return client;
         }
     }

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to