You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by yo...@apache.org on 2021/10/26 01:18:05 UTC
[bookkeeper] 02/11:
fix-npe-when-pulsar-ZkBookieRackAffinityMapping-getBookieAddressResolver
(#2788)
This is an automated email from the ASF dual-hosted git repository.
yong pushed a commit to branch branch-4.14
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 6041ded98f44fe6bcc8edd3eed14be4a41358112
Author: gaozhangmin <ga...@qq.com>
AuthorDate: Thu Oct 21 20:48:47 2021 +0800
fix-npe-when-pulsar-ZkBookieRackAffinityMapping-getBookieAddressResolver (#2788)
Error log:
`16:21:20.140 [main] ERROR org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicyImpl - Failed to initialize DNS Resolver org.apache.pulsar.zookeeper.ZkBookieRackAffinityMapping, used default subnet resolver : java.lang.RuntimeException: java.lang.NullPointerException java.lang.NullPointerException`
`BookieAddressResolver` should be set before `((Configurable) dnsResolver).setConf(conf);`
It will throw npe. when pulsar `ZkBookieRackAffinityMapping` invoke getBookieAddressResolver
(cherry picked from commit 031d168abdeedb6acbee7839c902a184f083da4c)
---
.../client/RackawareEnsemblePlacementPolicyImpl.java | 9 ++++-----
.../client/ZoneawareEnsemblePlacementPolicyImpl.java | 1 +
.../client/TestRackawareEnsemblePlacementPolicy.java | 14 ++++++++++++++
3 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java
index 679aec3..a4e3c80 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RackawareEnsemblePlacementPolicyImpl.java
@@ -260,6 +260,7 @@ public class RackawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsembleP
String dnsResolverName = conf.getString(REPP_DNS_RESOLVER_CLASS, ScriptBasedMapping.class.getName());
try {
dnsResolver = ReflectionUtils.newInstance(dnsResolverName, DNSToSwitchMapping.class);
+ dnsResolver.setBookieAddressResolver(bookieAddressResolver);
if (dnsResolver instanceof Configurable) {
((Configurable) dnsResolver).setConf(conf);
}
@@ -269,9 +270,10 @@ public class RackawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsembleP
}
} catch (RuntimeException re) {
if (!conf.getEnforceMinNumRacksPerWriteQuorum()) {
- LOG.error("Failed to initialize DNS Resolver {}, used default subnet resolver : {} {}",
- dnsResolverName, re, re.getMessage());
+ LOG.error("Failed to initialize DNS Resolver {}, used default subnet resolver ",
+ dnsResolverName, re);
dnsResolver = new DefaultResolver(this::getDefaultRack);
+ dnsResolver.setBookieAddressResolver(bookieAddressResolver);
} else {
/*
* if minNumRacksPerWriteQuorum is enforced, then it
@@ -282,9 +284,6 @@ public class RackawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsembleP
}
}
}
- if (dnsResolver != null) {
- dnsResolver.setBookieAddressResolver(bookieAddressResolver);
- }
slowBookies = CacheBuilder.newBuilder()
.expireAfterWrite(conf.getBookieFailureHistoryExpirationMSec(), TimeUnit.MILLISECONDS)
.build(new CacheLoader<BookieId, Long>() {
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java
index 990d60f..61b81ed 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/ZoneawareEnsemblePlacementPolicyImpl.java
@@ -233,6 +233,7 @@ public class ZoneawareEnsemblePlacementPolicyImpl extends TopologyAwareEnsembleP
} else {
String dnsResolverName = conf.getString(REPP_DNS_RESOLVER_CLASS, ScriptBasedMapping.class.getName());
actualDNSResolver = ReflectionUtils.newInstance(dnsResolverName, DNSToSwitchMapping.class);
+ actualDNSResolver.setBookieAddressResolver(bookieAddressResolver);
if (actualDNSResolver instanceof Configurable) {
((Configurable) actualDNSResolver).setConf(conf);
}
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java
index f0520d4..28a27ee 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java
@@ -43,13 +43,16 @@ import org.apache.bookkeeper.client.EnsemblePlacementPolicy.PlacementPolicyAdher
import org.apache.bookkeeper.client.ITopologyAwareEnsemblePlacementPolicy.Ensemble;
import org.apache.bookkeeper.client.TopologyAwareEnsemblePlacementPolicy.EnsembleForReplacementWithNoConstraints;
import org.apache.bookkeeper.client.TopologyAwareEnsemblePlacementPolicy.TruePredicate;
+import org.apache.bookkeeper.common.util.ReflectionUtils;
import org.apache.bookkeeper.conf.ClientConfiguration;
+import org.apache.bookkeeper.net.AbstractDNSToSwitchMapping;
import org.apache.bookkeeper.net.BookieId;
import org.apache.bookkeeper.net.BookieNode;
import org.apache.bookkeeper.net.BookieSocketAddress;
import org.apache.bookkeeper.net.DNSToSwitchMapping;
import org.apache.bookkeeper.net.NetworkTopology;
import org.apache.bookkeeper.net.Node;
+import org.apache.bookkeeper.net.ScriptBasedMapping;
import org.apache.bookkeeper.proto.BookieAddressResolver;
import org.apache.bookkeeper.stats.Gauge;
import org.apache.bookkeeper.stats.NullStatsLogger;
@@ -147,6 +150,17 @@ public class TestRackawareEnsemblePlacementPolicy extends TestCase {
}
@Test
+ public void testInitalize() throws Exception{
+ String dnsResolverName = conf.getString(REPP_DNS_RESOLVER_CLASS, ScriptBasedMapping.class.getName());
+ DNSToSwitchMapping dnsResolver = ReflectionUtils.newInstance(dnsResolverName, DNSToSwitchMapping.class);
+ AbstractDNSToSwitchMapping tmp = (AbstractDNSToSwitchMapping) dnsResolver;
+ assertNull(tmp.getBookieAddressResolver());
+
+ dnsResolver.setBookieAddressResolver(repp.bookieAddressResolver);
+ assertNotNull(tmp.getBookieAddressResolver());
+ }
+
+ @Test
public void testNodeDown() throws Exception {
repp.uninitalize();
updateMyRack(NetworkTopology.DEFAULT_REGION_AND_RACK);