You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by ni...@apache.org on 2022/04/06 12:45:06 UTC
[bookkeeper] 02/03: Fix region/rack aware placement police replace bookie bug (#2642)
This is an automated email from the ASF dual-hosted git repository.
nicoloboschi pushed a commit to branch branch-4.14
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 25010888123a1b17c4aad41f04015ef35e1a69ac
Author: Hang Chen <ch...@apache.org>
AuthorDate: Thu Mar 31 21:39:47 2022 +0800
Fix region/rack aware placement police replace bookie bug (#2642)
(cherry picked from commit 4443c60739ad8f3ea2156c9bd7243e44a22709c9)
---
.../client/RegionAwareEnsemblePlacementPolicy.java | 1 +
.../TopologyAwareEnsemblePlacementPolicy.java | 8 ++++
.../TestRegionAwareEnsemblePlacementPolicy.java | 48 ++++++++++++++++++++++
3 files changed, 57 insertions(+)
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java
index 5c1b0a1a3..383260dc8 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java
@@ -129,6 +129,7 @@ public class RegionAwareEnsemblePlacementPolicy extends RackawareEnsemblePlaceme
BookieNode node = createBookieNode(addr);
topology.add(node);
knownBookies.put(addr, node);
+ historyBookies.put(addr, node);
String region = getLocalRegion(node);
if (null == perRegionPlacement.get(region)) {
perRegionPlacement.put(region, new RackawareEnsemblePlacementPolicy()
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java
index 59bc893a9..7fdf3c5dd 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java
@@ -62,6 +62,7 @@ abstract class TopologyAwareEnsemblePlacementPolicy implements
static final Logger LOG = LoggerFactory.getLogger(TopologyAwareEnsemblePlacementPolicy.class);
public static final String REPP_DNS_RESOLVER_CLASS = "reppDnsResolverClass";
protected final Map<BookieId, BookieNode> knownBookies = new HashMap<BookieId, BookieNode>();
+ protected final Map<BookieId, BookieNode> historyBookies = new HashMap<BookieId, BookieNode>();
protected final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
protected Map<BookieNode, WeightedObject> bookieInfoMap = new HashMap<BookieNode, WeightedObject>();
// Initialize to empty set
@@ -717,6 +718,7 @@ abstract class TopologyAwareEnsemblePlacementPolicy implements
BookieNode node = createBookieNode(addr);
topology.add(node);
knownBookies.put(addr, node);
+ historyBookies.put(addr, node);
if (this.isWeighted) {
this.bookieInfoMap.putIfAbsent(node, new BookieInfo());
}
@@ -750,6 +752,7 @@ abstract class TopologyAwareEnsemblePlacementPolicy implements
topology.remove(node);
topology.add(newNode);
knownBookies.put(bookieAddress, newNode);
+ historyBookies.put(bookieAddress, newNode);
}
} catch (IllegalArgumentException | NetworkTopologyImpl.InvalidTopologyException e) {
LOG.error("Failed to update bookie rack info: {} ", bookieAddress, e);
@@ -798,6 +801,11 @@ abstract class TopologyAwareEnsemblePlacementPolicy implements
try {
return NetUtils.resolveNetworkLocation(dnsResolver, bookieAddressResolver.resolve(addr));
} catch (BookieAddressResolver.BookieIdNotResolvedException err) {
+ BookieNode historyBookie = historyBookies.get(addr);
+ if (null != historyBookie) {
+ return historyBookie.getNetworkLocation();
+ }
+
LOG.error("Cannot resolve bookieId {} to a network address, resolving as {}", addr,
NetworkTopology.DEFAULT_REGION_AND_RACK, err);
return NetworkTopology.DEFAULT_REGION_AND_RACK;
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRegionAwareEnsemblePlacementPolicy.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRegionAwareEnsemblePlacementPolicy.java
index b96d3a488..39649a66c 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRegionAwareEnsemblePlacementPolicy.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRegionAwareEnsemblePlacementPolicy.java
@@ -1421,6 +1421,54 @@ public class TestRegionAwareEnsemblePlacementPolicy extends TestCase {
return numCoveredWriteQuorums;
}
+ @Test
+ public void testRecoveryOnNodeFailure() throws Exception {
+ repp.uninitalize();
+ repp = new RegionAwareEnsemblePlacementPolicy();
+ repp.initialize(conf, Optional.empty(), timer, DISABLE_ALL,
+ NullStatsLogger.INSTANCE, BookieSocketAddress.LEGACY_BOOKIEID_RESOLVER);
+ BookieSocketAddress addr1 = new BookieSocketAddress("127.0.0.2", 3181);
+ BookieSocketAddress addr2 = new BookieSocketAddress("127.0.0.3", 3181);
+ BookieSocketAddress addr3 = new BookieSocketAddress("127.0.0.4", 3181);
+ BookieSocketAddress addr4 = new BookieSocketAddress("127.0.0.5", 3181);
+ BookieSocketAddress addr5 = new BookieSocketAddress("127.0.0.6", 3181);
+ BookieSocketAddress addr6 = new BookieSocketAddress("127.0.0.7", 3181);
+
+ // Update dns mapping
+ StaticDNSResolver.addNodeToRack(addr1.getHostName(), "/region1/r1");
+ StaticDNSResolver.addNodeToRack(addr2.getHostName(), "/region1/r1");
+ StaticDNSResolver.addNodeToRack(addr3.getHostName(), "/region2/r2");
+ StaticDNSResolver.addNodeToRack(addr4.getHostName(), "/region2/r2");
+ StaticDNSResolver.addNodeToRack(addr5.getHostName(), "/region3/r3");
+ StaticDNSResolver.addNodeToRack(addr6.getHostName(), "/region3/r3");
+
+ // Update cluster
+ Set<BookieId> addrs = new HashSet<>();
+ addrs.add(addr1.toBookieId());
+ addrs.add(addr2.toBookieId());
+ addrs.add(addr3.toBookieId());
+ addrs.add(addr4.toBookieId());
+ addrs.add(addr5.toBookieId());
+ addrs.add(addr6.toBookieId());
+
+ repp.onClusterChanged(addrs, new HashSet<>());
+
+ Set<BookieId> bookiesLeftSet = new HashSet<>();
+ bookiesLeftSet.add(addr1.toBookieId());
+ repp.handleBookiesThatLeft(bookiesLeftSet);
+
+ List<BookieId> currentEnsemble = new ArrayList<>();
+ currentEnsemble.add(addr1.toBookieId());
+ currentEnsemble.add(addr3.toBookieId());
+ currentEnsemble.add(addr6.toBookieId());
+
+ EnsemblePlacementPolicy.PlacementResult<BookieId> placementResult = repp.replaceBookie(3,
+ 3, 2, null,
+ currentEnsemble, addr1.toBookieId(), new HashSet<>());
+
+ assertEquals(placementResult.getResult(), addr2.toBookieId());
+ }
+
@Test
public void testNodeWithFailures() throws Exception {
repp.uninitalize();