package org.infinispan.query.affinity; import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.infinispan.distribution.ch.ConsistentHash; import org.infinispan.query.logging.Log; import org.infinispan.remoting.transport.Address; import org.infinispan.util.logging.LogFactory; /** * Allocates one index shard per Infinispan segment, with the shard identifier equals to the segment. * * @since 9.0 */ class PerSegmentShardDistribution implements ShardDistribution { private static final Log logger = LogFactory.getLog(PerSegmentShardDistribution.class, Log.class); private final Set<String> identifiers; private final ConsistentHash consistentHash; PerSegmentShardDistribution(ConsistentHash consistentHash) { int numSegments = consistentHash.getNumSegments(); this.consistentHash = consistentHash; this.identifiers = IntStream.range(0, numSegments).boxed().map(String::valueOf).collect(Collectors.toSet()); logger.debugf("Created with numSegments %d", numSegments); } @Override public Set<String> getShardsIdentifiers() { return Collections.unmodifiableSet(identifiers); } @Override public Address getOwner(String shardId) { return consistentHash.locatePrimaryOwnerForSegment(Integer.valueOf(shardId)); } @Override public Set<String> getShards(Address address) { return consistentHash.getPrimarySegmentsForOwner(address).stream() .map(String::valueOf).collect(Collectors.toSet()); } @Override public String getShardFromSegment(Integer segment) { return String.valueOf(segment); } }