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 <[email protected]> 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);
