public static void assertHashIds(Map<ServerAddress, List<Integer>> hashIds, List<HotRodServer> servers, String cacheName) { Cache cache = servers.get(0).getCacheManager().getCache(cacheName); DistributionManager distributionManager = cache.getAdvancedCache().getDistributionManager(); ConsistentHash consistentHash = distributionManager.getCacheTopology().getCurrentCH(); int numSegments = consistentHash.getNumSegments(); int numOwners = consistentHash.getNumOwners(); assertEquals(hashIds.size(), servers.size()); int segmentSize = (int) Math.ceil((double) Integer.MAX_VALUE / numSegments); Map<Integer, ServerAddress>[] owners = new Map[numSegments]; for (Map.Entry<ServerAddress, List<Integer>> entry : hashIds.entrySet()) { ServerAddress serverAddress = entry.getKey(); List<Integer> serverHashIds = entry.getValue(); for (Integer hashId : serverHashIds) { int segmentIdx = (hashId / segmentSize + numSegments - 1) % numSegments; int ownerIdx = hashId % segmentSize; if (owners[segmentIdx] == null) { owners[segmentIdx] = new HashMap<>(); } owners[segmentIdx].put(ownerIdx, serverAddress); } } for (int i = 0; i < numSegments; ++i) { List<ServerAddress> segmentOwners = owners[i].entrySet().stream().sorted(Comparator.comparing(Map.Entry::getKey)) .map(Map.Entry::getValue).collect(Collectors.toList()); assertEquals(segmentOwners.size(), numOwners); List<ServerAddress> chOwners = consistentHash.locateOwnersForSegment(i).stream() .map(a -> clusterAddressToServerAddress(servers, a)).collect(Collectors.toList()); assertEquals(segmentOwners, chOwners); } }
public static void assertReplicatedHashIds(Map<ServerAddress, List<Integer>> hashIds, List<HotRodServer> servers, String cacheName) { Cache cache = servers.get(0).getCacheManager().getCache(cacheName); DistributionManager distributionManager = cache.getAdvancedCache().getDistributionManager(); ConsistentHash consistentHash = distributionManager.getCacheTopology().getCurrentCH(); int numSegments = consistentHash.getNumSegments(); int numOwners = consistentHash.getNumOwners(); // replicated responses have just one segment, and each server should have only one hash id: 0 assertEquals(hashIds.size(), servers.size()); assertEquals(numSegments, 1); for (Map.Entry<ServerAddress, List<Integer>> entry : hashIds.entrySet()) { List<Integer> serverHashIds = entry.getValue(); assertEquals(serverHashIds.size(), 1); assertEquals(serverHashIds.get(0).intValue(), 0); } }
private void checkRehashed(DistributionManager dm, List<Cache<Object,Object>> caches, List<Address> addresses) { TestingUtil.waitForNoRebalance(caches); assertNull(dm.getCacheTopology().getPendingCH()); ConsistentHash ch = dm.getCacheTopology().getCurrentCH(); assertEquals(addresses, ch.getMembers()); for (int i = 0; i < ch.getNumSegments(); i++) { assertEquals(ch.getNumOwners(), ch.locateOwnersForSegment(i).size()); } } }
public static void assertHashTopology20Received(AbstractTestTopologyAwareResponse topoResp, List<HotRodServer> servers, String cacheName, int expectedTopologyId) { TestHashDistAware20Response hashTopologyResp = (TestHashDistAware20Response) topoResp; assertEquals(expectedTopologyId, hashTopologyResp.topologyId); assertEquals(hashTopologyResp.members.size(), servers.size()); Set<ServerAddress> serverAddresses = servers.stream().map(HotRodServer::getAddress).collect(Collectors.toSet()); hashTopologyResp.members.forEach(member -> assertTrue(serverAddresses.contains(member))); assertEquals(hashTopologyResp.hashFunction, 3); // Assert segments Cache cache = servers.get(0).getCacheManager().getCache(cacheName); LocalizedCacheTopology cacheTopology = cache.getAdvancedCache().getDistributionManager().getCacheTopology(); assertEquals(cacheTopology.getActualMembers().size(), servers.size()); ConsistentHash ch = cacheTopology.getCurrentCH(); int numSegments = ch.getNumSegments(); int numOwners = ch.getNumOwners(); assertEquals(hashTopologyResp.segments.size(), numSegments); for (int i = 0; i < numSegments; ++i) { List<Address> segment = ch.locateOwnersForSegment(i); Iterable<ServerAddress> members = hashTopologyResp.segments.get(i); assertEquals(Math.min(numOwners, ch.getMembers().size()), segment.size()); int count = 0; for (ServerAddress member : members) { count++; assertTrue(serverAddresses.contains(member)); } // The number of servers could be smaller than the number of CH members (same as the number of actual members) assertEquals(Math.min(numOwners, servers.size()), count); } }
assertEquals(Arrays.asList(address(0), address(1)), dm0.getCacheTopology().getCurrentCH().getMembers()); assertNull(dm0.getCacheTopology().getPendingCH()); assertEquals(Arrays.asList(address(0), address(1)), dm0.getCacheTopology().getCurrentCH().getMembers()); assertNull(dm0.getCacheTopology().getPendingCH());
assertEquals(Arrays.asList(address(0), address(1)), dm0a.getCacheTopology().getCurrentCH().getMembers()); assertNull(dm0a.getCacheTopology().getPendingCH()); assertEquals(Arrays.asList(address(0), address(1)), dm0b.getCacheTopology().getCurrentCH().getMembers()); assertNull(dm0b.getCacheTopology().getPendingCH()); assertFalse((Boolean) mBeanServer.getAttribute(ltmName1, REBALANCING_ENABLED)); assertNull(dm0a.getCacheTopology().getPendingCH()); assertEquals(Arrays.asList(address(0), address(1)), dm0a.getCacheTopology().getCurrentCH().getMembers()); assertEquals(Arrays.asList(address(0), address(1)), dm0b.getCacheTopology().getCurrentCH().getMembers());
private Future<Void> simulateTopologyUpdate(Cache<Object, Object> cache) { StateTransferLock stl4 = TestingUtil.extractComponent(cache, StateTransferLock.class); DistributionManager dm4 = cache.getAdvancedCache().getDistributionManager(); LocalizedCacheTopology cacheTopology = dm4.getCacheTopology(); int newTopologyId = cacheTopology.getTopologyId() + 1; CacheTopology newTopology = new CacheTopology(newTopologyId, cacheTopology.getRebalanceId(), cacheTopology.getCurrentCH(), cacheTopology.getPendingCH(), cacheTopology.getUnionCH(), cacheTopology.getPhase(), cacheTopology.getActualMembers(), cacheTopology.getMembersPersistentUUIDs()); dm4.setCacheTopology(newTopology); return fork(() -> stl4.notifyTransactionDataReceived(newTopologyId)); } }
assertEquals(Arrays.asList(address(0), address(1)), dm0.getCacheTopology().getCurrentCH().getMembers()); assertNull(dm0.getCacheTopology().getPendingCH()); assertFalse((Boolean) mBeanServer.getAttribute(ltmName1, REBALANCING_ENABLED)); assertNull(dm0.getCacheTopology().getPendingCH()); assertEquals(Arrays.asList(address(0), address(1)), dm0.getCacheTopology().getCurrentCH().getMembers()); assertNull(dm0.getCacheTopology().getPendingCH()); assertEquals(RebalancingStatus.COMPLETE.toString(), stm0.getRebalancingStatus()); ConsistentHash ch = dm0.getCacheTopology().getCurrentCH(); assertEquals(Arrays.asList(address(0), address(1), address(2), address(3)), ch.getMembers()); for (int i = 0; i < ch.getNumSegments(); i++) { DistributionManager dm2 = advancedCache(2).getDistributionManager(); assertNull(dm2.getCacheTopology().getPendingCH()); ch = dm2.getCacheTopology().getCurrentCH(); assertEquals(Arrays.asList(address(2), address(3)), ch.getMembers()); assertEquals(RebalancingStatus.COMPLETE.toString(), stm2.getRebalancingStatus()); assertNull(dm2.getCacheTopology().getPendingCH()); ch = dm2.getCacheTopology().getCurrentCH(); assertEquals(Arrays.asList(address(2), address(3)), ch.getMembers()); for (int i = 0; i < ch.getNumSegments(); i++) {