use of com.linkedin.d2.balancer.util.hashing.RingBasedUriMapper in project rest.li by linkedin.
the class RingBasedURIMapperTest method testNeedScatterGather.
@Test
public void testNeedScatterGather() throws ServiceUnavailableException {
// Both sticky and partitioned
HashRingProvider ringProvider = createStaticHashRingProvider(100, 10, getHashFunction(true));
PartitionInfoProvider infoProvider = createRangeBasedPartitionInfoProvider(10);
URIMapper mapper = new RingBasedUriMapper(ringProvider, infoProvider);
Assert.assertTrue(mapper.needScatterGather(TEST_SERVICE));
// Only sticky
ringProvider = createStaticHashRingProvider(100, 1, getHashFunction(true));
infoProvider = createRangeBasedPartitionInfoProvider(1);
mapper = new RingBasedUriMapper(ringProvider, infoProvider);
Assert.assertTrue(mapper.needScatterGather(TEST_SERVICE));
// Only partitioned
ringProvider = createStaticHashRingProvider(100, 10, getHashFunction(false));
infoProvider = createRangeBasedPartitionInfoProvider(10);
mapper = new RingBasedUriMapper(ringProvider, infoProvider);
Assert.assertTrue(mapper.needScatterGather(TEST_SERVICE));
// neither
ringProvider = createStaticHashRingProvider(100, 1, getHashFunction(false));
infoProvider = createRangeBasedPartitionInfoProvider(1);
mapper = new RingBasedUriMapper(ringProvider, infoProvider);
Assert.assertFalse(mapper.needScatterGather(TEST_SERVICE));
}
use of com.linkedin.d2.balancer.util.hashing.RingBasedUriMapper in project rest.li by linkedin.
the class RingBasedURIMapperTest method testPartitionIdOverride.
@Test(dataProvider = "stickyPartitionPermutation")
public void testPartitionIdOverride(boolean sticky, boolean partitioned) throws Exception {
int partitionCount = partitioned ? 10 : 1;
int totalHostCount = 100;
HashRingProvider ringProvider = createStaticHashRingProvider(totalHostCount, partitionCount, getHashFunction(sticky));
PartitionInfoProvider infoProvider = createRangeBasedPartitionInfoProvider(partitionCount);
URIMapper mapper = new RingBasedUriMapper(ringProvider, infoProvider);
URIKeyPair<Integer> request = new URIKeyPair<>(new URI("d2://testService/1"), IntStream.range(0, partitionCount).boxed().collect(Collectors.toSet()));
if (partitioned) {
Assert.assertThrows(() -> mapper.mapUris(Arrays.asList(request, request)));
}
URIMappingResult<Integer> uriMapperResult = mapper.mapUris(Collections.singletonList(request));
Map<URI, Set<Integer>> mappedKeys = uriMapperResult.getMappedKeys();
Assert.assertTrue(uriMapperResult.getUnmappedKeys().isEmpty());
Assert.assertEquals(mappedKeys.size(), partitionCount);
Assert.assertEquals(mappedKeys.keySet().stream().map(URIMapperTestUtil::getPartitionIdForURI).collect(Collectors.toSet()).size(), partitionCount);
for (Set<Integer> keys : mappedKeys.values()) {
Assert.assertTrue(keys.isEmpty());
}
}
use of com.linkedin.d2.balancer.util.hashing.RingBasedUriMapper in project rest.li by linkedin.
the class RingBasedURIMapperTest method testUnmappedKeys.
@Test(dataProvider = "stickyPartitionPermutation")
public void testUnmappedKeys(boolean sticky, boolean partitioned) throws Exception {
int partitionCount = partitioned ? 10 : 1;
int requestPerPartition = 100;
List<Ring<URI>> rings = new ArrayList<>();
IntStream.range(0, partitionCount).forEach(i -> rings.add(new MPConsistentHashRing<>(Collections.emptyMap())));
StaticRingProvider ringProvider = new StaticRingProvider(rings);
ringProvider.setHashFunction(getHashFunction(sticky));
PartitionInfoProvider infoProvider = createRangeBasedPartitionInfoProvider(partitionCount);
URIMapper mapper = new RingBasedUriMapper(ringProvider, infoProvider);
List<URIKeyPair<Integer>> requests = testUtil.generateRequests(partitionCount, requestPerPartition);
URIMappingResult<Integer> uriMapperResultNormal = mapper.mapUris(requests);
Assert.assertTrue(uriMapperResultNormal.getUnmappedKeys().size() == partitionCount);
uriMapperResultNormal.getUnmappedKeys().forEach((key, value) -> Assert.assertTrue(value.size() == requestPerPartition));
URIKeyPair<Integer> request = new URIKeyPair<>(new URI("d2://testService/1"), IntStream.range(0, partitionCount).boxed().collect(Collectors.toSet()));
URIMappingResult<Integer> uriMapperResultCustom = mapper.mapUris(Collections.singletonList(request));
Assert.assertTrue(uriMapperResultCustom.getUnmappedKeys().size() == partitionCount);
uriMapperResultCustom.getUnmappedKeys().forEach((key, value) -> Assert.assertTrue(value.isEmpty()));
}
use of com.linkedin.d2.balancer.util.hashing.RingBasedUriMapper in project rest.li by linkedin.
the class RingBasedURIMapperTest method testErrorHandling.
@Test
public void testErrorHandling() throws ServiceUnavailableException, URISyntaxException {
int partitionCount = 10;
int totalHostCount = 100;
HashRingProvider ringProvider = createStaticHashRingProvider(totalHostCount, partitionCount, getHashFunction(true));
PartitionInfoProvider infoProvider = createRangeBasedPartitionInfoProvider(partitionCount);
URIMapper mapper = new RingBasedUriMapper(ringProvider, infoProvider);
URIKeyPair<Integer> requestWithoutPartitionId = new URIKeyPair<>(42, new URI("d2://badService/2"));
URIKeyPair<Integer> requestWithoutKey = new URIKeyPair<>(43, new URI("d2://badService/partitionId=3"));
URIKeyPair<Integer> requestWithoutBoth = new URIKeyPair<>(44, new URI("d2://badService"));
List<URIKeyPair<Integer>> requests = Arrays.asList(requestWithoutKey, requestWithoutPartitionId, requestWithoutBoth);
URIMappingResult<Integer> result = mapper.mapUris(requests);
Assert.assertTrue(result.getMappedKeys().isEmpty());
Assert.assertTrue(result.getUnmappedKeys().get(-1).contains(42));
Assert.assertTrue(result.getUnmappedKeys().get(-1).contains(43));
Assert.assertTrue(result.getUnmappedKeys().get(-1).contains(44));
}
use of com.linkedin.d2.balancer.util.hashing.RingBasedUriMapper in project rest.li by linkedin.
the class RingBasedURIMapperTest method testStickyAndPartitioning.
@Test
public void testStickyAndPartitioning() throws ServiceUnavailableException {
int partitionCount = 10;
int requestPerPartition = 100;
int totalHostCount = 100;
HashRingProvider ringProvider = createStaticHashRingProvider(totalHostCount, partitionCount, getHashFunction(true));
PartitionInfoProvider infoProvider = createRangeBasedPartitionInfoProvider(partitionCount);
URIMapper mapper = new RingBasedUriMapper(ringProvider, infoProvider);
List<URIKeyPair<Integer>> requests = testUtil.generateRequests(partitionCount, requestPerPartition);
URIMappingResult<Integer> results = mapper.mapUris(requests);
Map<URI, Set<Integer>> mapping = results.getMappedKeys();
Map<Integer, Set<Integer>> unmappedKeys = results.getUnmappedKeys();
Map<URI, Integer> hostToPartition = results.getHostPartitionInfo();
Assert.assertTrue(unmappedKeys.isEmpty());
Assert.assertEquals(100, mapping.size());
Assert.assertEquals(100, hostToPartition.size());
}
Aggregations