@@ -1787,6 +1787,103 @@ public void testRegionsWithDiskWeight() throws Exception {
1787
1787
assertEquals (3 , ensemble .size ());
1788
1788
}
1789
1789
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
+
1790
1887
@ Test
1791
1888
public void testNotifyRackChangeWithOldRegion () throws Exception {
1792
1889
BookieSocketAddress addr1 = new BookieSocketAddress ("127.0.1.1" , 3181 );
0 commit comments