Skip to content

Commit 55d274b

Browse files
authored
Fix region aware placement policy disk weight dose not update. (#4522)
* Fix region aware placement policy disk weight dose not update.
1 parent 0df3caf commit 55d274b

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

bookkeeper-server/src/main/java/org/apache/bookkeeper/client/RegionAwareEnsemblePlacementPolicy.java

+8
Original file line numberDiff line numberDiff line change
@@ -663,4 +663,12 @@ public PlacementPolicyAdherence isEnsembleAdheringToPlacementPolicy(List<BookieI
663663
*/
664664
return PlacementPolicyAdherence.MEETS_STRICT;
665665
}
666+
667+
@Override
668+
public void updateBookieInfo(Map<BookieId, BookieInfoReader.BookieInfo> bookieInfoMap) {
669+
super.updateBookieInfo(bookieInfoMap);
670+
for (TopologyAwareEnsemblePlacementPolicy policy : perRegionPlacement.values()) {
671+
policy.updateBookieInfo(bookieInfoMap);
672+
}
673+
}
666674
}

bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestRegionAwareEnsemblePlacementPolicy.java

+97
Original file line numberDiff line numberDiff line change
@@ -1787,6 +1787,103 @@ public void testRegionsWithDiskWeight() throws Exception {
17871787
assertEquals(3, ensemble.size());
17881788
}
17891789

1790+
@Test
1791+
public void testRegionsWithDifferentDiskWeight() throws Exception {
1792+
repp.uninitalize();
1793+
repp = new RegionAwareEnsemblePlacementPolicy();
1794+
conf.setProperty(REPP_ENABLE_VALIDATION, false);
1795+
conf.setDiskWeightBasedPlacementEnabled(true);
1796+
repp.initialize(conf, Optional.empty(), timer, DISABLE_ALL,
1797+
NullStatsLogger.INSTANCE, BookieSocketAddress.LEGACY_BOOKIEID_RESOLVER);
1798+
BookieSocketAddress addr1 = new BookieSocketAddress("127.0.0.2", 3181);
1799+
BookieSocketAddress addr2 = new BookieSocketAddress("127.0.0.3", 3181);
1800+
BookieSocketAddress addr3 = new BookieSocketAddress("127.0.0.4", 3181);
1801+
BookieSocketAddress addr4 = new BookieSocketAddress("127.0.0.5", 3181);
1802+
BookieSocketAddress addr5 = new BookieSocketAddress("127.0.0.6", 3181);
1803+
1804+
// update dns mapping
1805+
StaticDNSResolver.addNodeToRack(addr1.getHostName(), "/region1/r1");
1806+
StaticDNSResolver.addNodeToRack(addr2.getHostName(), "/region1/r1");
1807+
StaticDNSResolver.addNodeToRack(addr3.getHostName(), "/region2/r2");
1808+
StaticDNSResolver.addNodeToRack(addr4.getHostName(), "/region2/r2");
1809+
StaticDNSResolver.addNodeToRack(addr5.getHostName(), "/region2/r2");
1810+
// Update cluster
1811+
Set<BookieId> addrs = new HashSet<>();
1812+
addrs.add(addr1.toBookieId());
1813+
addrs.add(addr2.toBookieId());
1814+
addrs.add(addr3.toBookieId());
1815+
addrs.add(addr4.toBookieId());
1816+
addrs.add(addr5.toBookieId());
1817+
repp.onClusterChanged(addrs, new HashSet<>());
1818+
1819+
// update bookie weight
1820+
// due to default BookieMaxWeightMultipleForWeightBasedPlacement=3, the test cases need to be in the range
1821+
Map<BookieId, BookieInfoReader.BookieInfo> bookieInfoMap = new HashMap<>();
1822+
bookieInfoMap.put(addr1.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 800000));
1823+
bookieInfoMap.put(addr2.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 400000));
1824+
bookieInfoMap.put(addr3.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 200000));
1825+
bookieInfoMap.put(addr4.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 300000));
1826+
bookieInfoMap.put(addr5.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 400000));
1827+
repp.updateBookieInfo(bookieInfoMap);
1828+
1829+
List<BookieId> ensemble;
1830+
Map<BookieId, Integer> countMap = new HashMap<>();
1831+
addrs.forEach(a -> countMap.put(a, 0));
1832+
int loopTimes = 5000;
1833+
for (int i = 0; i < loopTimes; ++i) {
1834+
ensemble = repp.newEnsemble(2, 2, 2, null,
1835+
new HashSet<>()).getResult();
1836+
for (BookieId bookieId : ensemble) {
1837+
countMap.put(bookieId, countMap.get(bookieId) + 1);
1838+
}
1839+
}
1840+
1841+
// c1 should be 2x than c2
1842+
// c4 should be 1.5x than c3
1843+
// c5 should be 2x than c3
1844+
// we allow a range of (-50%, 50%) deviation instead of the exact multiples
1845+
int c1, c2, c3, c4, c5;
1846+
c1 = countMap.get(addr1.toBookieId());
1847+
c2 = countMap.get(addr2.toBookieId());
1848+
c3 = countMap.get(addr3.toBookieId());
1849+
c4 = countMap.get(addr4.toBookieId());
1850+
c5 = countMap.get(addr5.toBookieId());
1851+
assertTrue(Math.abs((double) c1 / c2 - 2.0) < 1.0);
1852+
assertTrue(Math.abs((double) c4 / c3 - 1.5) < 1.0);
1853+
assertTrue(Math.abs((double) c5 / c3 - 2.0) < 1.0);
1854+
1855+
// update bookie weight
1856+
// due to default BookieMaxWeightMultipleForWeightBasedPlacement=3, the test cases need to be in the range
1857+
bookieInfoMap.put(addr1.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 400000));
1858+
bookieInfoMap.put(addr2.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 800000));
1859+
bookieInfoMap.put(addr3.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 400000));
1860+
bookieInfoMap.put(addr4.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 300000));
1861+
bookieInfoMap.put(addr5.toBookieId(), new BookieInfoReader.BookieInfo(1000000, 200000));
1862+
repp.updateBookieInfo(bookieInfoMap);
1863+
1864+
addrs.forEach(a -> countMap.put(a, 0));
1865+
for (int i = 0; i < loopTimes; ++i) {
1866+
ensemble = repp.newEnsemble(2, 2, 2, null,
1867+
new HashSet<>()).getResult();
1868+
for (BookieId bookieId : ensemble) {
1869+
countMap.put(bookieId, countMap.get(bookieId) + 1);
1870+
}
1871+
}
1872+
1873+
// c2 should be 2x than c1
1874+
// c4 should be 1.5x than c5
1875+
// c3 should be 2x than c5
1876+
// we allow a range of (-50%, 50%) deviation instead of the exact multiples
1877+
c1 = countMap.get(addr1.toBookieId());
1878+
c2 = countMap.get(addr2.toBookieId());
1879+
c3 = countMap.get(addr3.toBookieId());
1880+
c4 = countMap.get(addr4.toBookieId());
1881+
c5 = countMap.get(addr5.toBookieId());
1882+
assertTrue(Math.abs((double) c2 / c1 - 2.0) < 1.0);
1883+
assertTrue(Math.abs((double) c4 / c5 - 1.5) < 1.0);
1884+
assertTrue(Math.abs((double) c3 / c5 - 2.0) < 1.0);
1885+
}
1886+
17901887
@Test
17911888
public void testNotifyRackChangeWithOldRegion() throws Exception {
17921889
BookieSocketAddress addr1 = new BookieSocketAddress("127.0.1.1", 3181);

0 commit comments

Comments
 (0)