package com.lambdaworks.redis.cluster.models.slots; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import com.google.common.net.HostAndPort; import com.lambdaworks.redis.RedisURI; import com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode; import com.lambdaworks.redis.internal.LettuceAssert; /** * Represents a range of slots together with its master and slaves. * * @author Mark Paluch * @since 3.0 */ @SuppressWarnings("serial") public class ClusterSlotRange implements Serializable { private int from; private int to; @Deprecated private HostAndPort master; private RedisClusterNode masterNode; @Deprecated private List<HostAndPort> slaves = Collections.emptyList(); private List<RedisClusterNode> slaveNodes = Collections.emptyList(); public ClusterSlotRange() { } /** * Constructs a {@link ClusterSlotRange} * * @param from from slot * @param to to slot * @param master master for the slots, may be {@literal null} * @param slaves list of slaves must not be {@literal null} but may be empty * @deprecated Use {@link #ClusterSlotRange(int, int, RedisClusterNode, List)} */ @Deprecated public ClusterSlotRange(int from, int to, HostAndPort master, List<HostAndPort> slaves) { LettuceAssert.notNull(master, "Master must not be null"); LettuceAssert.notNull(slaves, "Slaves must not be null"); this.from = from; this.to = to; this.masterNode = toRedisClusterNode(master, null, Collections.singleton(RedisClusterNode.NodeFlag.MASTER)); this.slaveNodes = toRedisClusterNodes(slaves, null, Collections.singleton(RedisClusterNode.NodeFlag.SLAVE)); this.master = master; this.slaves = slaves; } /** * Constructs a {@link ClusterSlotRange} * * @param from from slot * @param to to slot * @param masterNode master for the slots, may be {@literal null} * @param slaveNodes list of slaves must not be {@literal null} but may be empty */ public ClusterSlotRange(int from, int to, RedisClusterNode masterNode, List<RedisClusterNode> slaveNodes) { LettuceAssert.notNull(masterNode, "MasterNode must not be null"); LettuceAssert.notNull(slaveNodes, "SlaveNodes must not be null"); this.from = from; this.to = to; this.master = toHostAndPort(masterNode); this.slaves = toHostAndPorts(slaveNodes); this.masterNode = masterNode; this.slaveNodes = slaveNodes; } private HostAndPort toHostAndPort(RedisClusterNode redisClusterNode) { RedisURI uri = redisClusterNode.getUri(); return HostAndPort.fromParts(uri.getHost(), uri.getPort()); } private List<HostAndPort> toHostAndPorts(List<RedisClusterNode> nodes) { List<HostAndPort> result = new ArrayList<>(); for (RedisClusterNode node : nodes) { result.add(toHostAndPort(node)); } return result; } private RedisClusterNode toRedisClusterNode(HostAndPort hostAndPort, String slaveOf, Set<RedisClusterNode.NodeFlag> flags) { RedisClusterNode redisClusterNode = new RedisClusterNode(); redisClusterNode.setUri(RedisURI .create(hostAndPort.getHostText(), hostAndPort.getPortOrDefault(RedisURI.DEFAULT_REDIS_PORT))); redisClusterNode.setSlaveOf(slaveOf); redisClusterNode.setFlags(flags); return redisClusterNode; } private List<RedisClusterNode> toRedisClusterNodes(List<HostAndPort> hostAndPorts, String slaveOf, Set<RedisClusterNode.NodeFlag> flags) { List<RedisClusterNode> result = new ArrayList<>(); for (HostAndPort hostAndPort : hostAndPorts) { result.add(toRedisClusterNode(hostAndPort, slaveOf, flags)); } return result; } public int getFrom() { return from; } public int getTo() { return to; } /** * @deprecated Use {@link #getMasterNode()} to retrieve the {@code nodeId} and the {@code slaveOf} details. * @return the master host and port */ @Deprecated public HostAndPort getMaster() { return master; } /** * @deprecated Use {@link #getSlaveNodes()} to retrieve the {@code nodeId} and the {@code slaveOf} details. * @return the master host and port */ @Deprecated public List<HostAndPort> getSlaves() { return slaves; } public RedisClusterNode getMasterNode() { return masterNode; } public void setMasterNode(RedisClusterNode masterNode) { this.masterNode = masterNode; } public List<RedisClusterNode> getSlaveNodes() { return slaveNodes; } public void setSlaveNodes(List<RedisClusterNode> slaveNodes) { this.slaveNodes = slaveNodes; } public void setFrom(int from) { this.from = from; } public void setTo(int to) { this.to = to; } public void setMaster(HostAndPort master) { LettuceAssert.notNull(master, "Master must not be null"); this.master = master; } public void setSlaves(List<HostAndPort> slaves) { LettuceAssert.notNull(slaves, "Slaves must not be null"); this.slaves = slaves; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append(getClass().getSimpleName()); sb.append(" [from=").append(from); sb.append(", to=").append(to); sb.append(", masterNode=").append(masterNode); sb.append(", slaveNodes=").append(slaveNodes); sb.append(']'); return sb.toString(); } }