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)) {
