Merge pull request #838 from jackygurui/cluster-runner-to-support-add-slaves

cluster runner now support adding slaves
pull/841/head
Nikita Koksharov 8 years ago committed by GitHub
commit 1c9eba2c50

@ -17,9 +17,10 @@ import java.util.List;
public class ClusterRunner { public class ClusterRunner {
private final LinkedHashMap<RedisRunner, String> nodes = new LinkedHashMap<>(); private final LinkedHashMap<RedisRunner, String> nodes = new LinkedHashMap<>();
private final LinkedHashMap<String, String> masters = new LinkedHashMap<>();
public ClusterRunner addNode(RedisRunner runner) { public ClusterRunner addNode(RedisRunner runner) {
nodes.put(runner, getRandomId()); nodes.putIfAbsent(runner, getRandomId());
if (!runner.hasOption(RedisRunner.REDIS_OPTIONS.CLUSTER_ENABLED)) { if (!runner.hasOption(RedisRunner.REDIS_OPTIONS.CLUSTER_ENABLED)) {
runner.clusterEnabled(true); runner.clusterEnabled(true);
} }
@ -36,11 +37,20 @@ public class ClusterRunner {
return this; 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<RedisRunner.RedisProcess> run() throws IOException, InterruptedException, RedisRunner.FailedToStartRedisException { public List<RedisRunner.RedisProcess> run() throws IOException, InterruptedException, RedisRunner.FailedToStartRedisException {
ArrayList<RedisRunner.RedisProcess> processes = new ArrayList<>(); ArrayList<RedisRunner.RedisProcess> processes = new ArrayList<>();
for (RedisRunner runner : nodes.keySet()) { for (RedisRunner runner : nodes.keySet()) {
List<String> options = getClusterConfig(runner); List<String> 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)); System.out.println("WRITING CONFIG: for " + nodes.get(runner));
try (PrintWriter printer = new PrintWriter(new FileWriter(confFile))) { try (PrintWriter printer = new PrintWriter(new FileWriter(confFile))) {
options.stream().forEach((line) -> { options.stream().forEach((line) -> {
@ -64,13 +74,20 @@ public class ClusterRunner {
List<String> nodeConfig = new ArrayList<>(); List<String> nodeConfig = new ArrayList<>();
int c = 0; int c = 0;
for (RedisRunner node : nodes.keySet()) { for (RedisRunner node : nodes.keySet()) {
String nodeId = nodes.get(node);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String nodeAddr = node.getInitialBindAddr() + ":" + node.getPort(); String nodeAddr = node.getInitialBindAddr() + ":" + node.getPort();
sb.append(nodes.get(node)).append(" "); sb.append(nodeId).append(" ");
sb.append(nodeAddr).append(" "); sb.append(nodeAddr).append(" ");
sb.append(me.equals(nodeAddr) sb.append(me.equals(nodeAddr)
? "myself," ? "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("0").append(" ");
sb.append(me.equals(nodeAddr) sb.append(me.equals(nodeAddr)
? "0" ? "0"

@ -191,6 +191,7 @@ public class RedisRunner {
protected static RedisRunner.RedisProcess defaultRedisInstance; protected static RedisRunner.RedisProcess defaultRedisInstance;
private static int defaultRedisInstanceExitCode; private static int defaultRedisInstanceExitCode;
private String path = "";
private String defaultDir = Paths.get("").toString(); private String defaultDir = Paths.get("").toString();
private boolean nosave = false; private boolean nosave = false;
private boolean randomDir = false; private boolean randomDir = false;
@ -459,6 +460,7 @@ public class RedisRunner {
public RedisRunner dir(String dir) { public RedisRunner dir(String dir) {
if (!randomDir) { if (!randomDir) {
addConfigOption(REDIS_OPTIONS.DIR, dir); addConfigOption(REDIS_OPTIONS.DIR, dir);
this.path = dir;
} }
return this; return this;
} }
@ -825,6 +827,10 @@ public class RedisRunner {
return this.defaultDir; return this.defaultDir;
} }
public String dir() {
return this.path;
}
public String getInitialBindAddr() { public String getInitialBindAddr() {
return bindAddr.size() > 0 ? bindAddr.get(0) : "localhost"; return bindAddr.size() > 0 ? bindAddr.get(0) : "localhost";
} }
@ -849,7 +855,7 @@ public class RedisRunner {
public boolean deleteClusterFile() { public boolean deleteClusterFile() {
File f = new File(clusterFile); File f = new File(clusterFile);
if (f.exists()) { if (f.exists() && isRandomDir()) {
System.out.println("REDIS RUNNER: Deleting cluster config file " + f.getAbsolutePath()); System.out.println("REDIS RUNNER: Deleting cluster config file " + f.getAbsolutePath());
return f.delete(); return f.delete();
} }

Loading…
Cancel
Save