diff --git a/redisson/src/test/java/org/redisson/ClusterRunner.java b/redisson/src/test/java/org/redisson/ClusterRunner.java index 64be2c03d..60dd5afe0 100644 --- a/redisson/src/test/java/org/redisson/ClusterRunner.java +++ b/redisson/src/test/java/org/redisson/ClusterRunner.java @@ -9,6 +9,10 @@ import java.security.SecureRandom; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import org.redisson.misc.BiHashMap; /** * @@ -46,8 +50,8 @@ public class ClusterRunner { return this; } - public List run() throws IOException, InterruptedException, RedisRunner.FailedToStartRedisException { - ArrayList processes = new ArrayList<>(); + public synchronized ClusterProcesses run() throws IOException, InterruptedException, RedisRunner.FailedToStartRedisException { + BiHashMap processes = new BiHashMap<>(); for (RedisRunner runner : nodes.keySet()) { List options = getClusterConfig(runner); String confFile = runner.dir() + File.separator + nodes.get(runner) + ".conf"; @@ -58,15 +62,15 @@ public class ClusterRunner { System.out.println(line); }); } - processes.add(runner.clusterConfigFile(confFile).run()); + processes.put(nodes.get(runner), runner.clusterConfigFile(confFile).run()); } Thread.sleep(1000); - for (RedisRunner.RedisProcess process : processes) { + for (RedisRunner.RedisProcess process : processes.valueSet()) { if (!process.isAlive()) { throw new RedisRunner.FailedToStartRedisException(); } } - return processes; + return new ClusterProcesses(processes); } private List getClusterConfig(RedisRunner runner) { @@ -94,8 +98,10 @@ public class ClusterRunner { : "1").append(" "); sb.append(c + 1).append(" "); sb.append("connected "); - sb.append(getSlots(c, nodes.size())); - c++; + if (!slaveMasters.containsKey(nodeId)) { + sb.append(getSlots(c, nodes.size() - slaveMasters.size())); + c++; + } nodeConfig.add(sb.toString()); } nodeConfig.add("vars currentEpoch 0 lastVoteEpoch 0"); @@ -113,4 +119,37 @@ public class ClusterRunner { final SecureRandom r = new SecureRandom(); return new BigInteger(160, r).toString(16); } + + public static class ClusterProcesses { + private final BiHashMap processes; + + private ClusterProcesses(BiHashMap processes) { + this.processes = processes; + } + + public RedisRunner.RedisProcess getProcess(String nodeId) { + return processes.get(nodeId); + } + + public String getNodeId(RedisRunner.RedisProcess process) { + return processes.reverseGet(process); + } + + public Set getNodes() { + return processes.valueSet(); + } + + public Set getNodeIds() { + return processes.keySet(); + } + + public synchronized Map shutdown() { + return processes + .entrySet() + .stream() + .collect(Collectors.toMap( + e -> e.getKey(), + e -> e.getValue().stop())); + } + } } diff --git a/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceTest.java b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceTest.java index a2e36842c..588dbbf24 100644 --- a/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceTest.java +++ b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceTest.java @@ -1,6 +1,8 @@ package org.redisson.spring.support; import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; import org.junit.After; import org.junit.AfterClass; import static org.junit.Assert.*; @@ -124,14 +126,24 @@ public class SpringNamespaceTest extends BaseTest { RedisRunner.getDefaultRedisServerInstance().getRedisServerPort(), 2).run(); System.setProperty("sentinel3Address", sentinel3.getRedisServerAddressAndPort()); - + RedisRunner slave = new RedisRunner().randomPort().randomDir().nosave(); ClusterRunner clusterRunner = new ClusterRunner() - .addNode(new RedisRunner().randomPort().randomDir().nosave()) - .addNode(new RedisRunner().randomPort().randomDir().nosave()) - .addNode(new RedisRunner().randomPort().randomDir().nosave()); - List nodes = clusterRunner.run(); - nodes.stream().forEach((node) -> { - System.setProperty("node" + (nodes.indexOf(node) + 1) + "Address", node.getRedisServerAddressAndPort()); + .addNode(new RedisRunner().randomPort().randomDir().nosave(),//master1 + new RedisRunner().randomPort().randomDir().nosave(),//slave1-1 + new RedisRunner().randomPort().randomDir().nosave(),//slave1-2 + slave)//slave1-3 + .addNode(new RedisRunner().randomPort().randomDir().nosave(),//master2 + new RedisRunner().randomPort().randomDir().nosave(),//slave2-1 + new RedisRunner().randomPort().randomDir().nosave())//slave2-2 + .addNode(new RedisRunner().randomPort().randomDir().nosave(),//master3 + new RedisRunner().randomPort().randomDir().nosave(),//slave3-1 + new RedisRunner().randomPort().randomDir().nosave())//slave3-2 + .addNode(slave,//slave1-3 + new RedisRunner().randomPort().randomDir().nosave(),//slave1-3-1 + new RedisRunner().randomPort().randomDir().nosave());//slave1-3-2 + final AtomicLong index = new AtomicLong(0); + clusterRunner.run().getNodes().stream().forEach((node) -> { + System.setProperty("node" + (index.incrementAndGet()) + "Address", node.getRedisServerAddressAndPort()); }); context = new ClassPathXmlApplicationContext("classpath:org/redisson/spring/support/namespace.xml"); diff --git a/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java index df1c38bf3..83d07f1e0 100644 --- a/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java +++ b/redisson/src/test/java/org/redisson/spring/support/SpringNamespaceWikiTest.java @@ -180,16 +180,14 @@ public class SpringNamespaceWikiTest { .port(6381) .randomDir() .nosave()); - List nodes = clusterRunner.run(); + ClusterRunner.ClusterProcesses cluster = clusterRunner.run(); try { ((ConfigurableApplicationContext) new ClassPathXmlApplicationContext("classpath:org/redisson/spring/support/namespace_wiki_cluster.xml")) .close(); } finally { - for (RedisRunner.RedisProcess node : nodes) { - node.stop(); - } + cluster.shutdown(); } } }