Skip to content

Commit 1880447

Browse files
committed
Fix disk weight ensemble infinite loop bug
1 parent 3ed93a0 commit 1880447

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

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

+51
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.apache.bookkeeper.client;
1919

20+
import static org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicyImpl.RACKNAME_DISTANCE_FROM_LEAVES;
2021
import static org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicyImpl.REPP_DNS_RESOLVER_CLASS;
2122
import static org.apache.bookkeeper.client.RackawareEnsemblePlacementPolicyImpl.shuffleWithMask;
2223
import static org.apache.bookkeeper.client.RoundRobinDistributionSchedule.writeSetFromValues;
@@ -69,6 +70,7 @@
6970
import org.hamcrest.Matcher;
7071
import org.hamcrest.TypeSafeMatcher;
7172
import org.junit.Test;
73+
import org.junit.jupiter.api.Timeout;
7274
import org.slf4j.Logger;
7375
import org.slf4j.LoggerFactory;
7476

@@ -790,6 +792,55 @@ public void testNewEnsembleWithSingleRack() throws Exception {
790792
}
791793
}
792794

795+
@Test(timeout = 30_000)
796+
public void testNewEnsembleWithExcludeBookies() throws Exception {
797+
repp.uninitalize();
798+
updateMyRack(NetworkTopology.DEFAULT_REGION_AND_RACK);
799+
800+
repp = new RackawareEnsemblePlacementPolicy();
801+
conf.setDiskWeightBasedPlacementEnabled(true);
802+
repp.initialize(conf, Optional.<DNSToSwitchMapping>empty(), timer,
803+
DISABLE_ALL, NullStatsLogger.INSTANCE, BookieSocketAddress.LEGACY_BOOKIEID_RESOLVER);
804+
repp.withDefaultRack(NetworkTopology.DEFAULT_REGION_AND_RACK);
805+
806+
BookieSocketAddress addr1 = new BookieSocketAddress("127.0.0.2", 3181);
807+
BookieSocketAddress addr2 = new BookieSocketAddress("127.0.0.3", 3181);
808+
BookieSocketAddress addr3 = new BookieSocketAddress("127.0.0.4", 3181);
809+
810+
BookieNode addr1Node = new BookieNode(addr1.toBookieId(), repp.resolveNetworkLocation(addr1.toBookieId()));
811+
BookieNode addr2Node = new BookieNode(addr2.toBookieId(), repp.resolveNetworkLocation(addr2.toBookieId()));
812+
BookieNode addr3Node = new BookieNode(addr3.toBookieId(), repp.resolveNetworkLocation(addr3.toBookieId()));
813+
// update dns mapping
814+
StaticDNSResolver.addNodeToRack(addr1.getHostName(), "/default-region/r1");
815+
StaticDNSResolver.addNodeToRack(addr2.getHostName(), "/default-region/r2");
816+
StaticDNSResolver.addNodeToRack(addr3.getHostName(), "/default-region/r1");
817+
// Update cluster
818+
Set<BookieId> addrs = new HashSet<BookieId>();
819+
addrs.add(addr1.toBookieId());
820+
addrs.add(addr2.toBookieId());
821+
addrs.add(addr3.toBookieId());
822+
repp.onClusterChanged(addrs, new HashSet<BookieId>());
823+
824+
Set<Node> excludeBookies = new HashSet<>();
825+
excludeBookies.add(addr2Node);
826+
excludeBookies.add(addr3Node);
827+
828+
TopologyAwareEnsemblePlacementPolicy.RRTopologyAwareCoverageEnsemble ensemble =
829+
new TopologyAwareEnsemblePlacementPolicy.RRTopologyAwareCoverageEnsemble(
830+
2, 2, 2,
831+
RACKNAME_DISTANCE_FROM_LEAVES,
832+
null, null, 1);
833+
ensemble.addNode(new BookieNode(addr1.toBookieId(), repp.resolveNetworkLocation(addr1.toBookieId())));
834+
try {
835+
repp.selectRandomInternal(null, 1, excludeBookies, null, ensemble);
836+
fail("Should fail with not enough bookies exception");
837+
} catch (BKNotEnoughBookiesException ex) {
838+
//
839+
}
840+
841+
conf.setDiskWeightBasedPlacementEnabled(false);
842+
}
843+
793844
@Test
794845
public void testSingleRackWithEnforceMinNumRacks() throws Exception {
795846
repp.uninitalize();

0 commit comments

Comments
 (0)