|
29 | 29 | import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
30 | 30 | import io.netty.util.HashedWheelTimer;
|
31 | 31 | import java.net.InetAddress;
|
| 32 | +import java.net.UnknownHostException; |
32 | 33 | import java.util.ArrayList;
|
33 | 34 | import java.util.Arrays;
|
34 | 35 | import java.util.Collection;
|
|
40 | 41 | import java.util.Optional;
|
41 | 42 | import java.util.Set;
|
42 | 43 | import java.util.concurrent.TimeUnit;
|
| 44 | +import java.util.concurrent.atomic.AtomicInteger; |
43 | 45 | import java.util.function.Consumer;
|
44 | 46 | import junit.framework.TestCase;
|
45 | 47 | import org.apache.bookkeeper.client.BKException.BKNotEnoughBookiesException;
|
@@ -2354,6 +2356,68 @@ public void testNodeWithFailures() throws Exception {
|
2354 | 2356 | assertEquals(ensemble.get(reoderSet.get(3)), addr2.toBookieId());
|
2355 | 2357 | assertEquals(ensemble.get(reoderSet.get(0)), addr3.toBookieId());
|
2356 | 2358 | assertEquals(ensemble.get(reoderSet.get(1)), addr4.toBookieId());
|
| 2359 | + StaticDNSResolver.reset(); |
| 2360 | + } |
| 2361 | + |
| 2362 | + @Test |
| 2363 | + public void testReplaceNotAvailableBookieWithDefaultRack() throws Exception { |
| 2364 | + repp.uninitalize(); |
| 2365 | + repp.withDefaultRack(NetworkTopology.DEFAULT_RACK); |
| 2366 | + AtomicInteger counter = new AtomicInteger(); |
| 2367 | + BookieAddressResolver mockResolver = new BookieAddressResolver() { |
| 2368 | + @Override |
| 2369 | + public BookieSocketAddress resolve(BookieId bookieId) throws BookieIdNotResolvedException { |
| 2370 | + if (bookieId.equals(addr1.toBookieId()) && counter.getAndIncrement() >= 1) { |
| 2371 | + throw new BookieIdNotResolvedException(bookieId, |
| 2372 | + new RuntimeException(addr1.toBookieId() + " shutdown")); |
| 2373 | + } |
| 2374 | + try { |
| 2375 | + return new BookieSocketAddress(bookieId.toString()); |
| 2376 | + } catch (UnknownHostException err) { |
| 2377 | + throw new BookieIdNotResolvedException(bookieId, err); |
| 2378 | + } |
| 2379 | + } |
| 2380 | + }; |
| 2381 | + |
| 2382 | + repp.initialize(conf, Optional.<DNSToSwitchMapping>empty(), timer, DISABLE_ALL, NullStatsLogger.INSTANCE, |
| 2383 | + mockResolver); |
| 2384 | + BookieSocketAddress addr1 = new BookieSocketAddress("127.0.0.2", 3181); |
| 2385 | + BookieSocketAddress addr2 = new BookieSocketAddress("127.0.0.3", 3181); |
| 2386 | + BookieSocketAddress addr3 = new BookieSocketAddress("127.0.0.4", 3181); |
| 2387 | + BookieSocketAddress addr4 = new BookieSocketAddress("127.0.0.5", 3181); |
| 2388 | + // update dns mapping |
| 2389 | + StaticDNSResolver.addNodeToRack(addr1.getHostName(), NetworkTopology.DEFAULT_RACK); |
| 2390 | + StaticDNSResolver.addNodeToRack(addr2.getHostName(), "/r1"); |
| 2391 | + StaticDNSResolver.addNodeToRack(addr3.getHostName(), "/r1"); |
| 2392 | + StaticDNSResolver.addNodeToRack(addr4.getHostName(), NetworkTopology.DEFAULT_RACK); |
| 2393 | + |
| 2394 | + // Update cluster |
| 2395 | + Set<BookieId> addrs = new HashSet<BookieId>(); |
| 2396 | + addrs.add(addr1.toBookieId()); |
| 2397 | + addrs.add(addr2.toBookieId()); |
| 2398 | + addrs.add(addr3.toBookieId()); |
| 2399 | + addrs.add(addr4.toBookieId()); |
| 2400 | + repp.onClusterChanged(addrs, new HashSet<BookieId>()); |
| 2401 | + |
| 2402 | + // replace node under r1 |
| 2403 | + EnsemblePlacementPolicy.PlacementResult<BookieId> replaceBookieResponse = |
| 2404 | + repp.replaceBookie(1, 1, 1, null, new ArrayList<>(), addr1.toBookieId(), new HashSet<>()); |
| 2405 | + BookieId replacedBookie = replaceBookieResponse.getResult(); |
| 2406 | + assertEquals(addr4.toBookieId(), replacedBookie); |
| 2407 | + |
| 2408 | + //clear history bookies and make addr1 shutdown. |
| 2409 | + repp = new RackawareEnsemblePlacementPolicy(); |
| 2410 | + repp.initialize(conf, Optional.<DNSToSwitchMapping>empty(), timer, DISABLE_ALL, NullStatsLogger.INSTANCE, |
| 2411 | + mockResolver); |
| 2412 | + |
| 2413 | + addrs.remove(addr1.toBookieId()); |
| 2414 | + repp.onClusterChanged(addrs, new HashSet<BookieId>()); |
| 2415 | + |
| 2416 | + // replace node under r1 again |
| 2417 | + replaceBookieResponse = |
| 2418 | + repp.replaceBookie(1, 1, 1, null, new ArrayList<>(), addr1.toBookieId(), new HashSet<>()); |
| 2419 | + replacedBookie = replaceBookieResponse.getResult(); |
| 2420 | + assertEquals(addr4.toBookieId(), replacedBookie); |
2357 | 2421 | }
|
2358 | 2422 |
|
2359 | 2423 | @Test
|
|
0 commit comments