package com.lambdaworks.redis.cluster; import static com.lambdaworks.redis.cluster.PartitionsConsensusTestSupport.createMap; import static com.lambdaworks.redis.cluster.PartitionsConsensusTestSupport.createNode; import static com.lambdaworks.redis.cluster.PartitionsConsensusTestSupport.createPartitions; import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; import java.util.Collections; import java.util.Map; import org.junit.Test; import com.lambdaworks.redis.RedisURI; import com.lambdaworks.redis.cluster.models.partitions.Partitions; import com.lambdaworks.redis.cluster.models.partitions.RedisClusterNode; /** * @author Mark Paluch */ public class HealthyMajorityPartitionsConsensusTest { private RedisClusterNode node1 = createNode(1); private RedisClusterNode node2 = createNode(2); private RedisClusterNode node3 = createNode(3); private RedisClusterNode node4 = createNode(4); private RedisClusterNode node5 = createNode(5); @Test public void sameSharedViewShouldDecideForHealthyNodes() throws Exception { Partitions partitions1 = createPartitions(node1, node2, node3, node4, node5); Partitions partitions2 = createPartitions(node1, node2, node3, node4, node5); Partitions partitions3 = createPartitions(node1, node2, node3, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); Partitions result = PartitionsConsensus.HEALTHY_MAJORITY.getPartitions(null, map); assertThat(Arrays.asList(partitions1, partitions2, partitions3)).contains(result); } @Test public void unhealthyNodeViewShouldDecideForHealthyNodes() throws Exception { Partitions partitions1 = createPartitions(node1, node2); Partitions partitions2 = createPartitions(node2, node3, node4, node5); Partitions partitions3 = createPartitions(node2, node3, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); node2.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); node3.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); node4.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); node5.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); Partitions result = PartitionsConsensus.HEALTHY_MAJORITY.getPartitions(null, map); assertThat(result).isSameAs(partitions1); } @Test public void splitNodeViewShouldDecideForHealthyNodes() throws Exception { Partitions partitions1 = createPartitions(node1, node2, node3); Partitions partitions2 = createPartitions(); Partitions partitions3 = createPartitions(node3, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); node1.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); node2.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); node3.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); Partitions result = PartitionsConsensus.HEALTHY_MAJORITY.getPartitions(null, map); assertThat(result).isSameAs(partitions3); } @Test public void splitUnhealthyNodeViewShouldDecideForHealthyNodes() throws Exception { Partitions partitions1 = createPartitions(node1, node2); Partitions partitions2 = createPartitions(node2, node3); Partitions partitions3 = createPartitions(node3, node4, node5); Map<RedisURI, Partitions> map = createMap(partitions1, partitions2, partitions3); node2.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); node3.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); node4.setFlags(Collections.singleton(RedisClusterNode.NodeFlag.FAIL)); Partitions result = PartitionsConsensus.HEALTHY_MAJORITY.getPartitions(null, map); assertThat(Arrays.asList(partitions1, partitions3)).contains(result); } }