Skip to content

Commit 31b4eb1

Browse files
gaozhangminnicoloboschi
authored andcommitted
only update topology when bookie rack changed
It is unnecessary to update topology, removing and adding the same bookieNode, if the rack of bookie stay unchanged. Reviewers: Yong Zhang <[email protected]>, Nicolò Boschi <[email protected]>, Andrey Yegorov <None>, ZhangJian He <[email protected]>, Enrico Olivelli <[email protected]> This closes #2790 from gaozhangmin/remove-unnecessary-update-rack (cherry picked from commit 67c963a) Signed-off-by: Nicolò Boschi <[email protected]>
1 parent 84529a8 commit 31b4eb1

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

Diff for: bookkeeper-server/src/main/java/org/apache/bookkeeper/client/TopologyAwareEnsemblePlacementPolicy.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -749,10 +749,12 @@ public void onBookieRackChange(List<BookieId> bookieAddressList) {
749749
if (node != null) {
750750
// refresh the rack info if its a known bookie
751751
BookieNode newNode = createBookieNode(bookieAddress);
752-
topology.remove(node);
753-
topology.add(newNode);
754-
knownBookies.put(bookieAddress, newNode);
755-
historyBookies.put(bookieAddress, newNode);
752+
if (!newNode.getNetworkLocation().equals(node.getNetworkLocation())) {
753+
topology.remove(node);
754+
topology.add(newNode);
755+
knownBookies.put(bookieAddress, newNode);
756+
historyBookies.put(bookieAddress, newNode);
757+
}
756758
}
757759
} catch (IllegalArgumentException | NetworkTopologyImpl.InvalidTopologyException e) {
758760
LOG.error("Failed to update bookie rack info: {} ", bookieAddress, e);

Diff for: bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRackawareEnsemblePlacementPolicy.java

+49
Original file line numberDiff line numberDiff line change
@@ -2142,6 +2142,55 @@ public void testShuffleWithMask() {
21422142
assertTrue(shuffleOccurred);
21432143
}
21442144

2145+
@Test
2146+
public void testUpdateTopologyWithRackChange() throws Exception {
2147+
String defaultRackForThisTest = NetworkTopology.DEFAULT_REGION_AND_RACK;
2148+
repp.uninitalize();
2149+
updateMyRack(defaultRackForThisTest);
2150+
2151+
// Update cluster
2152+
BookieSocketAddress newAddr1 = new BookieSocketAddress("127.0.0.100", 3181);
2153+
BookieSocketAddress newAddr2 = new BookieSocketAddress("127.0.0.101", 3181);
2154+
BookieSocketAddress newAddr3 = new BookieSocketAddress("127.0.0.102", 3181);
2155+
BookieSocketAddress newAddr4 = new BookieSocketAddress("127.0.0.103", 3181);
2156+
2157+
// update dns mapping
2158+
StaticDNSResolver.addNodeToRack(newAddr1.getHostName(), defaultRackForThisTest);
2159+
StaticDNSResolver.addNodeToRack(newAddr2.getHostName(), defaultRackForThisTest);
2160+
StaticDNSResolver.addNodeToRack(newAddr3.getHostName(), defaultRackForThisTest);
2161+
StaticDNSResolver.addNodeToRack(newAddr4.getHostName(), defaultRackForThisTest);
2162+
2163+
TestStatsProvider statsProvider = new TestStatsProvider();
2164+
TestStatsLogger statsLogger = statsProvider.getStatsLogger("");
2165+
2166+
repp = new RackawareEnsemblePlacementPolicy();
2167+
repp.initialize(conf, Optional.<DNSToSwitchMapping> empty(), timer,
2168+
DISABLE_ALL, statsLogger, BookieSocketAddress.LEGACY_BOOKIEID_RESOLVER);
2169+
repp.withDefaultRack(defaultRackForThisTest);
2170+
2171+
Gauge<? extends Number> numBookiesInDefaultRackGauge = statsLogger
2172+
.getGauge(BookKeeperClientStats.NUM_WRITABLE_BOOKIES_IN_DEFAULT_RACK);
2173+
2174+
Set<BookieId> writeableBookies = new HashSet<>();
2175+
Set<BookieId> readOnlyBookies = new HashSet<>();
2176+
writeableBookies.add(newAddr1.toBookieId());
2177+
writeableBookies.add(newAddr2.toBookieId());
2178+
writeableBookies.add(newAddr3.toBookieId());
2179+
writeableBookies.add(newAddr4.toBookieId());
2180+
repp.onClusterChanged(writeableBookies, readOnlyBookies);
2181+
// only writable bookie - newAddr1 in default rack
2182+
assertEquals("NUM_WRITABLE_BOOKIES_IN_DEFAULT_RACK guage value", 4, numBookiesInDefaultRackGauge.getSample());
2183+
2184+
// newAddr4 rack is changed and it is not in default anymore
2185+
StaticDNSResolver
2186+
.changeRack(Collections.singletonList(newAddr3), Collections.singletonList("/default-region/r4"));
2187+
assertEquals("NUM_WRITABLE_BOOKIES_IN_DEFAULT_RACK guage value", 3, numBookiesInDefaultRackGauge.getSample());
2188+
2189+
StaticDNSResolver
2190+
.changeRack(Collections.singletonList(newAddr1), Collections.singletonList(defaultRackForThisTest));
2191+
assertEquals("NUM_WRITABLE_BOOKIES_IN_DEFAULT_RACK guage value", 3, numBookiesInDefaultRackGauge.getSample());
2192+
}
2193+
21452194
@Test
21462195
public void testNumBookiesInDefaultRackGauge() throws Exception {
21472196
String defaultRackForThisTest = NetworkTopology.DEFAULT_REGION_AND_RACK;

0 commit comments

Comments
 (0)