Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
a0a8422
fix #2842. remove duplicate SPI definitions for 2.7.x
cvictory Jan 25, 2019
98b2f4b
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Feb 21, 2019
19824c3
fix: rename the thread name from DubboRegistryFailedRetryTimer to Dub…
cvictory Feb 21, 2019
05b158d
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Apr 8, 2019
6b6023f
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Apr 10, 2019
fbc167d
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Apr 16, 2019
9a96ac2
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Apr 18, 2019
a5366b4
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Apr 29, 2019
e4bbfc4
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Apr 30, 2019
2cbbd45
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory May 23, 2019
ae1e3bd
sync pull request 4138 (#4181)
beiwei30 May 28, 2019
d044536
Merge branch '2.7.2-release' of github.com:apache/incubator-dubbo
cvictory May 28, 2019
1d645df
merge
cvictory Jun 19, 2019
fe6c026
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Jun 24, 2019
e705a1b
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Jul 3, 2019
b686bf2
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Jul 9, 2019
c431f27
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Jul 18, 2019
bfc60f7
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Jul 25, 2019
cf5807e
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Jul 31, 2019
2d2a096
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Sep 5, 2019
b2f0024
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Sep 9, 2019
e4a3465
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Sep 16, 2019
3c673d6
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Sep 18, 2019
9b99cdb
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Oct 21, 2019
6be65d3
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Nov 4, 2019
1d457e7
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Nov 11, 2019
e722bba
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Nov 22, 2019
b555fcd
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Nov 22, 2019
671c17b
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Nov 22, 2019
907dfd7
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Feb 3, 2020
69b2ff5
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Feb 4, 2020
8068b8e
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Feb 5, 2020
29e74da
Merge branch 'master' of github.com:apache/incubator-dubbo
cvictory Feb 5, 2020
70da28d
optimize the zk connection condition. #4991
cvictory Feb 5, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
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;

Expand Down Expand Up @@ -54,20 +55,20 @@ public ZookeeperClient connect(URL url) {
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;
}
Expand All @@ -88,16 +89,17 @@ public ZookeeperClient connect(URL url) {
* @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;
}
Expand All @@ -122,9 +124,9 @@ List<String> getURLBackupAddress(URL url) {
* @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);
}
}

Expand Down Expand Up @@ -156,4 +158,11 @@ URL toClientURL(URL url) {
Map<String, ZookeeperClient> getZookeeperClientMap() {
return zookeeperClientMap;
}

private String getZookeeperMapKey(String userName, String address) {
if (StringUtils.isEmpty(userName)) {
return address;
}
return userName + "@" + address;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -99,16 +99,63 @@ public void testFetchAndUpdateZookeeperClientCache() throws Exception {
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();
}

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() {
Expand Down