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

chenhang pushed a commit to branch branch-2.8
in repository https://gitbox.apache.org/repos/asf/pulsar.git

commit 36890e8ca8f18cd0ab85b6a52e4b29f3381c594f
Author: gaozhangmin <[email protected]>
AuthorDate: Thu Oct 14 16:20:47 2021 +0800

    fix-npe-ZkBookieRackAffinityMapping (#11947)
    
    ### Motivation
    
    NPE when `ZkBookieRackAffinityMapping`
    
    ```
    17:24:03.724 [main-SendThread(bigdata-pulsar-bookie004.ys:2181)] INFO  
org.apache.zookeeper.ClientCnxn - Session establishment complete on server 
bigdata-pulsar-bookie004.ys/10.89.146.53:2181, session id = 0x57ba9d6a8d800a8, 
negotiated timeout = 30000
    17:24:03.725 [main-EventThread] INFO  
org.apache.bookkeeper.zookeeper.ZooKeeperWatcherBase - ZooKeeper client is 
connected now.
    17:24:03.792 [main] ERROR 
org.apache.pulsar.zookeeper.ZkBookieRackAffinityMapping - Error creating 
zookeeper client
    java.lang.IllegalArgumentException: Path must not end with / character
            at 
org.apache.zookeeper.common.PathUtils.validatePath(PathUtils.java:55) 
~[org.apache.zookeeper-zookeeper-3.6.3.jar:3.6.3]
            at 
org.apache.zookeeper.client.ConnectStringParser.<init>(ConnectStringParser.java:61)
 ~[org.apache.zookeeper-zookeeper-3.6.3.jar:3.6.3]
            at 
org.apache.zookeeper.ZooKeeper.createDefaultHostProvider(ZooKeeper.java:1515) 
~[org.apache.zookeeper-zookeeper-3.6.3.jar:3.6.3]
            at org.apache.zookeeper.ZooKeeper.<init>(ZooKeeper.java:1108) 
~[org.apache.zookeeper-zookeeper-3.6.3.jar:3.6.3]
            at 
org.apache.bookkeeper.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.java:286)
 ~[org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.zookeeper.ZooKeeperClient$Builder.build(ZooKeeperClient.java:247)
 ~[org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.pulsar.zookeeper.ZkBookieRackAffinityMapping.getAndSetZkCache(ZkBookieRackAffinityMapping.java:138)
 [org.apache.pulsar-pulsar-zookeeper-utils-2.8.0.jar:2.8.0]
            at 
org.apache.pulsar.zookeeper.ZkBookieRackAffinityMapping.setConf(ZkBookieRackAffinityMapping.java:75)
 [org.apache.pulsar-pulsar-zookeeper-utils-2.8.0.jar:2.8.0]
            at 
org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicyImpl.initialize(RackawareEnsemblePlacementPolicyImpl.java:264)
 [org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicyImpl.initialize(RackawareEnsemblePlacementPolicyImpl.java:80)
 [org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.client.BookKeeper.initializeEnsemblePlacementPolicy(BookKeeper.java:582)
 [org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.client.BookKeeper.<init>(BookKeeper.java:506) 
[org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.client.BookKeeper$Builder.build(BookKeeper.java:307) 
[org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.replication.Auditor.createBookKeeperClient(Auditor.java:270)
 [org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.replication.AutoRecoveryMain.<init>(AutoRecoveryMain.java:92)
 [org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.server.service.AutoRecoveryService.<init>(AutoRecoveryService.java:41)
 [org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at 
org.apache.bookkeeper.server.Main.buildBookieServer(Main.java:320) 
[org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at org.apache.bookkeeper.server.Main.doMain(Main.java:226) 
[org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
            at org.apache.bookkeeper.server.Main.main(Main.java:208) 
[org.apache.bookkeeper-bookkeeper-server-4.15.0-SNAPSHOT.jar:4.15.0-SNAPSHOT]
    17:24:04.806 [main] ERROR 
org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicyImpl - Failed to 
initialize DNS Resolver 
org.apache.pulsar.zookeeper.ZkBookieRackAffinityMapping, used default subnet 
resolver : java.lang.NullPointerException null
    ```
    
    ### Modifications
    
    1、change some deprecated method
    2、add a judgment.
    
    Co-authored-by: gavingaozhangmin <[email protected]>
    (cherry picked from commit c3d540c42a841262133d4a887cbe5ae724139586)
---
 .../zookeeper/ZkBookieRackAffinityMapping.java     | 27 +++++++++++++---------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git 
a/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
 
b/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
index 0bdffca..caeba51 100644
--- 
a/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
+++ 
b/pulsar-zookeeper-utils/src/main/java/org/apache/pulsar/zookeeper/ZkBookieRackAffinityMapping.java
@@ -21,7 +21,7 @@ package org.apache.pulsar.zookeeper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import java.net.InetAddress;
-import java.net.UnknownHostException;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -47,6 +47,8 @@ import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static 
org.apache.bookkeeper.meta.zk.ZKMetadataDriverBase.getZKServersFromServiceUri;
+
 /**
  * It provides the mapping of bookies to its rack from zookeeper.
  */
@@ -56,6 +58,7 @@ public class ZkBookieRackAffinityMapping extends 
AbstractDNSToSwitchMapping
 
     public static final String BOOKIE_INFO_ROOT_PATH = "/bookies";
     public static final String ZK_DATA_CACHE_BK_RACK_CONF_INSTANCE = 
"zk_data_cache_bk_rack_conf_instance";
+    private static final String ZK_LEDGERS_DEFAULT_ROOT_PATH = "/ledgers";
 
     private ZooKeeperDataCache<BookiesRackConfiguration> bookieMappingCache = 
null;
     private ITopologyAwareEnsemblePlacementPolicy<BookieNode> rackawarePolicy 
= null;
@@ -124,18 +127,20 @@ public class ZkBookieRackAffinityMapping extends 
AbstractDNSToSwitchMapping
         if (conf.getProperty(ZooKeeperCache.ZK_CACHE_INSTANCE) != null) {
             zkCache = (ZooKeeperCache) 
conf.getProperty(ZooKeeperCache.ZK_CACHE_INSTANCE);
         } else {
-            int zkTimeout;
-            String zkServers;
             if (conf instanceof ClientConfiguration) {
-                zkTimeout = ((ClientConfiguration) conf).getZkTimeout();
-                zkServers = ((ClientConfiguration) conf).getZkServers();
-                String zkLedgersRootPath = ((ClientConfiguration) 
conf).getZkLedgersRootPath();
+                int zkTimeout = ((ClientConfiguration) conf).getZkTimeout();
                 try {
-                    int zkLedgerRootIndex = zkLedgersRootPath.contains("/") ?
-                            zkLedgersRootPath.lastIndexOf("/") : 0;
-                    String zkChangeRoot = zkLedgersRootPath.substring(0, 
zkLedgerRootIndex);
-                    zkChangeRoot = zkChangeRoot.startsWith("/") ? zkChangeRoot 
: "/" + zkChangeRoot;
-                    ZooKeeper zkClient = 
ZooKeeperClient.newBuilder().connectString(zkServers + zkChangeRoot)
+                    final String metadataServiceUriStr = 
((ClientConfiguration) conf).getMetadataServiceUri();
+                    URI metadataServiceUri = URI.create(metadataServiceUriStr);
+                    String ledgersRootPath = metadataServiceUri.getPath();
+                    String zkServers;
+                    if (ZK_LEDGERS_DEFAULT_ROOT_PATH.equals(ledgersRootPath)) {
+                        zkServers = 
getZKServersFromServiceUri(metadataServiceUri);
+                    } else {
+                        int zkLedgerRootIndex = 
ledgersRootPath.lastIndexOf("/");
+                        zkServers = 
getZKServersFromServiceUri(metadataServiceUri) + ledgersRootPath.substring(0, 
zkLedgerRootIndex);
+                    }
+                    ZooKeeper zkClient = 
ZooKeeperClient.newBuilder().connectString(zkServers)
                             .sessionTimeoutMs(zkTimeout).build();
                     zkCache = new ZooKeeperCache("bookies-racks", zkClient,
                             (int) TimeUnit.MILLISECONDS.toSeconds(zkTimeout)) {

Reply via email to