You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by vi...@apache.org on 2020/02/05 06:58:06 UTC

[dubbo] 02/02: optimize the zk connection condition. #4991

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

victory pushed a commit to branch issue_4991
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit 70da28da1823a90ecb924117a6f3b70d4da6b876
Author: cvictory <sh...@gmail.com>
AuthorDate: Wed Feb 5 14:56:35 2020 +0800

    optimize the zk connection condition. #4991
---
 .../support/AbstractZookeeperTransporter.java      | 25 +++++++----
 .../support/AbstractZookeeperTransporterTest.java  | 49 +++++++++++++++++++++-
 2 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java
index 2b85d10..4a13df0 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.constants.RemotingConstants;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
 
@@ -54,20 +55,20 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
         ZookeeperClient zookeeperClient;
         List<String> addressList = getURLBackupAddress(url);
         // The field define the zookeeper server , including protocol, host, port, username, password
-        if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList)) != null && zookeeperClient.isConnected()) {
+        if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList, url.getUsername())) != null && zookeeperClient.isConnected()) {
             logger.info("find valid zookeeper client from the cache for address: " + url);
             return zookeeperClient;
         }
         // avoid creating too many connections, so add lock
         synchronized (zookeeperClientMap) {
-            if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList)) != null && zookeeperClient.isConnected()) {
+            if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList, url.getUsername())) != null && zookeeperClient.isConnected()) {
                 logger.info("find valid zookeeper client from the cache for address: " + url);
                 return zookeeperClient;
             }
 
             zookeeperClient = createZookeeperClient(url);
             logger.info("No valid zookeeper client found from cache, therefore create a new client for url. " + url);
-            writeToClientMap(addressList, zookeeperClient);
+            writeToClientMap(addressList, url.getUsername(), zookeeperClient);
         }
         return zookeeperClient;
     }
@@ -88,16 +89,17 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
      * @param addressList
      * @return
      */
-    ZookeeperClient fetchAndUpdateZookeeperClientCache(List<String> addressList) {
+    ZookeeperClient fetchAndUpdateZookeeperClientCache(List<String> addressList, String userName) {
 
         ZookeeperClient zookeeperClient = null;
         for (String address : addressList) {
-            if ((zookeeperClient = zookeeperClientMap.get(address)) != null && zookeeperClient.isConnected()) {
+            if ((zookeeperClient = zookeeperClientMap.get(getZookeeperMapKey(userName, address))) != null
+                    && zookeeperClient.isConnected()) {
                 break;
             }
         }
         if (zookeeperClient != null && zookeeperClient.isConnected()) {
-            writeToClientMap(addressList, zookeeperClient);
+            writeToClientMap(addressList, userName, zookeeperClient);
         }
         return zookeeperClient;
     }
@@ -122,9 +124,9 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
      * @param addressList
      * @param zookeeperClient
      */
-    void writeToClientMap(List<String> addressList, ZookeeperClient zookeeperClient) {
+    void writeToClientMap(List<String> addressList, String userName, ZookeeperClient zookeeperClient) {
         for (String address : addressList) {
-            zookeeperClientMap.put(address, zookeeperClient);
+            zookeeperClientMap.put(getZookeeperMapKey(userName, address), zookeeperClient);
         }
     }
 
@@ -156,4 +158,11 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
     Map<String, ZookeeperClient> getZookeeperClientMap() {
         return zookeeperClientMap;
     }
+
+    private String getZookeeperMapKey(String userName, String address) {
+        if (StringUtils.isEmpty(userName)) {
+            return address;
+        }
+        return userName + "@" + address;
+    }
 }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java
index 43cf481..c9fe1e7 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java
@@ -99,6 +99,41 @@ public class AbstractZookeeperTransporterTest {
         checkFetchAndUpdateCacheNotNull(url2);
         URL url3 = URL.valueOf("zookeeper://127.0.0.1:8778/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zkServerPort3 + "&address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
         checkFetchAndUpdateCacheNotNull(url3);
+        Assertions.assertTrue(checkFetchAndUpdateCacheTheSame(url2, url3));
+        Assertions.assertTrue(checkFetchAndUpdateCacheTheSame(url2, url));
+        zkServer2.stop();
+        zkServer3.stop();
+    }
+
+    @Test
+    public void testFetchAndUpdateZookeeperClientCacheWhenDiffUser() throws Exception {
+        int zkServerPort2 = NetUtils.getAvailablePort();
+        TestingServer zkServer2 = new TestingServer(zkServerPort2, true);
+
+        int zkServerPort3 = NetUtils.getAvailablePort();
+        TestingServer zkServer3 = new TestingServer(zkServerPort3, true);
+
+        URL url = URL.valueOf("zookeeper://u1:p1@127.0.0.1:" + zkServerPort + "/org.apache.dubbo.registry.RegistryService?backup=127.0.0.1:" + zkServerPort3 + ",127.0.0.1:" + zkServerPort2 + "&application=metadatareport-local-xml-provider2&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=47418&specVersion=2.7.0-SNAPSHOT&timestamp=1547102428828");
+        ZookeeperClient newZookeeperClient = abstractZookeeperTransporter.connect(url);
+        //just for connected
+        newZookeeperClient.getContent("/dubbo/test");
+        Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 3);
+        Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("u1@127.0.0.1:" + zkServerPort), newZookeeperClient);
+        Assertions.assertNull(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zkServerPort));
+
+        URL url2 = URL.valueOf("zookeeper://u1:p1@127.0.0.1:" + zkServerPort + "/org.apache.dubbo.metadata.store.MetadataReport?address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
+        checkFetchAndUpdateCacheNotNull(url2);
+        URL url3 = URL.valueOf("zookeeper://u2:p2@127.0.0.1:8778/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zkServerPort3 + "&address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
+        checkFetchAndUpdateCacheNull(url3);
+        abstractZookeeperTransporter.connect(url3);
+        checkFetchAndUpdateCacheNotNull(url3);
+        URL url4 = URL.valueOf("zookeeper://127.0.0.1:8778/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zkServerPort3 + "&address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
+        checkFetchAndUpdateCacheNull(url4);
+        abstractZookeeperTransporter.connect(url4);
+        checkFetchAndUpdateCacheNotNull(url4);
+        Assertions.assertTrue(checkFetchAndUpdateCacheTheSame(url2, url));
+        Assertions.assertFalse(checkFetchAndUpdateCacheTheSame(url, url3));
+        Assertions.assertFalse(checkFetchAndUpdateCacheTheSame(url4, url3));
 
         zkServer2.stop();
         zkServer3.stop();
@@ -106,9 +141,21 @@ public class AbstractZookeeperTransporterTest {
 
     private void checkFetchAndUpdateCacheNotNull(URL url) {
         List<String> addressList = abstractZookeeperTransporter.getURLBackupAddress(url);
-        ZookeeperClient zookeeperClient = abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList);
+        ZookeeperClient zookeeperClient = abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList, url.getUsername());
         Assertions.assertNotNull(zookeeperClient);
     }
+    private void checkFetchAndUpdateCacheNull(URL url) {
+        List<String> addressList = abstractZookeeperTransporter.getURLBackupAddress(url);
+        ZookeeperClient zookeeperClient = abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList, url.getUsername());
+        Assertions.assertNull(zookeeperClient);
+    }
+
+    private boolean checkFetchAndUpdateCacheTheSame(URL url1, URL url2) {
+        List<String> addressList1 = abstractZookeeperTransporter.getURLBackupAddress(url1);
+        List<String> addressList2 = abstractZookeeperTransporter.getURLBackupAddress(url2);
+        return abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList1, url1.getUsername())
+                == abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList2, url2.getUsername());
+    }
 
     @Test
     public void testRepeatConnect() {