diff --git a/redisson/src/test/java/org/redisson/ClusterRunner.java b/redisson/src/test/java/org/redisson/ClusterRunner.java index b1c11228b..abca5b170 100644 --- a/redisson/src/test/java/org/redisson/ClusterRunner.java +++ b/redisson/src/test/java/org/redisson/ClusterRunner.java @@ -17,9 +17,10 @@ import java.util.List; public class ClusterRunner { private final LinkedHashMap nodes = new LinkedHashMap<>(); + private final LinkedHashMap masters = new LinkedHashMap<>(); public ClusterRunner addNode(RedisRunner runner) { - nodes.put(runner, getRandomId()); + nodes.putIfAbsent(runner, getRandomId()); if (!runner.hasOption(RedisRunner.REDIS_OPTIONS.CLUSTER_ENABLED)) { runner.clusterEnabled(true); } @@ -36,11 +37,20 @@ public class ClusterRunner { return this; } + public ClusterRunner addNode(RedisRunner master, RedisRunner... slaves) { + addNode(master); + for (RedisRunner slave : slaves) { + addNode(slave); + masters.put(nodes.get(slave), nodes.get(master)); + } + return this; + } + public List run() throws IOException, InterruptedException, RedisRunner.FailedToStartRedisException { ArrayList processes = new ArrayList<>(); for (RedisRunner runner : nodes.keySet()) { List options = getClusterConfig(runner); - String confFile = runner.defaultDir() + File.pathSeparator + nodes.get(runner) + ".conf"; + String confFile = runner.dir() + File.separatorChar + nodes.get(runner) + ".conf"; System.out.println("WRITING CONFIG: for " + nodes.get(runner)); try (PrintWriter printer = new PrintWriter(new FileWriter(confFile))) { options.stream().forEach((line) -> { @@ -64,13 +74,20 @@ public class ClusterRunner { List nodeConfig = new ArrayList<>(); int c = 0; for (RedisRunner node : nodes.keySet()) { + String nodeId = nodes.get(node); StringBuilder sb = new StringBuilder(); String nodeAddr = node.getInitialBindAddr() + ":" + node.getPort(); - sb.append(nodes.get(node)).append(" "); + sb.append(nodeId).append(" "); sb.append(nodeAddr).append(" "); sb.append(me.equals(nodeAddr) ? "myself," - : "").append("master -").append(" "); + : ""); + if (!masters.containsKey(nodeId)) { + sb.append("master -"); + } else { + sb.append("slave ").append(masters.get(nodeId)); + } + sb.append(" "); sb.append("0").append(" "); sb.append(me.equals(nodeAddr) ? "0" diff --git a/redisson/src/test/java/org/redisson/RedisRunner.java b/redisson/src/test/java/org/redisson/RedisRunner.java index e0990ffae..327f494b0 100644 --- a/redisson/src/test/java/org/redisson/RedisRunner.java +++ b/redisson/src/test/java/org/redisson/RedisRunner.java @@ -191,6 +191,7 @@ public class RedisRunner { protected static RedisRunner.RedisProcess defaultRedisInstance; private static int defaultRedisInstanceExitCode; + private String path = ""; private String defaultDir = Paths.get("").toString(); private boolean nosave = false; private boolean randomDir = false; @@ -459,6 +460,7 @@ public class RedisRunner { public RedisRunner dir(String dir) { if (!randomDir) { addConfigOption(REDIS_OPTIONS.DIR, dir); + this.path = dir; } return this; } @@ -824,6 +826,10 @@ public class RedisRunner { public String defaultDir() { return this.defaultDir; } + + public String dir() { + return this.path; + } public String getInitialBindAddr() { return bindAddr.size() > 0 ? bindAddr.get(0) : "localhost";