package org.nd4j.parameterserver.background;
import lombok.extern.slf4j.Slf4j;
import org.nd4j.parameterserver.ParameterServerSubscriber;
import org.zeroturnaround.exec.ProcessExecutor;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeoutException;
/**
* Start background daemons for tests
* Credit to:
* http://stackoverflow.com/questions/636367/executing-a-java-application-in-a-separate-process
* @author Adam Gibson
*/
@Slf4j
public class BackgroundDaemonStarter {
/**
* Start a slave daemon with
* the specified master url with the form of:
* hostname:port:streamId
* @param parameterLength the length of the parameters to
* be averaging
* @return
* @throws IOException
* @throws InterruptedException
*/
public static int startSlave(int parameterLength, String masterUrl, String mediaDriverDirectory) throws Exception {
return exec(ParameterServerSubscriber.class, mediaDriverDirectory, "-s", "1," + String.valueOf(parameterLength),
"-p", "40126", "-h", "localhost", "-id", "10", "-pm", masterUrl, "-sp", "9500");
}
/**
*
* Start a slave daemon with a default url of:
* localhost:40123:11
* where the url is:
* hostname:port:streamId
* @param parameterLength the parameter length of the ndarrays
* @return
* @throws IOException
* @throws InterruptedException
*/
public static int startSlave(int parameterLength, String mediaDriverDirectory) throws Exception {
return startSlave(parameterLength, "localhost:40123:11", mediaDriverDirectory);
}
public static String slaveConnectionUrl() {
return "localhost:40126:10";
}
/**
* Master connection url
* @return
*/
public static String masterResponderUrl() {
return "localhost:40124:12";
}
/**
* Master connection url
* @return
*/
public static String masterConnectionUrl() {
return "localhost:40123:11";
}
/**
*
* @param parameterLength
* @return
* @throws IOException
* @throws InterruptedException
*/
public static int startMaster(int parameterLength, String mediaDriverDirectory) throws Exception {
return exec(ParameterServerSubscriber.class, mediaDriverDirectory, "-m", "true", "-s",
"1," + String.valueOf(parameterLength), "-p", "40123", "-h", "localhost", "-id", "11", "-sp",
"9200");
}
/**
* Exec a java process in the background
* @param klass the main class to run
* @param mediaDriverDirectory the media driver directory to use
* @param args the args to use (can be null)
* @return the process exit code
* @throws IOException
* @throws InterruptedException
*/
public static int exec(Class klass, String mediaDriverDirectory, String... args) throws Exception {
String javaHome = System.getProperty("java.home");
String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = klass.getCanonicalName();
if (args == null || args.length < 1) {
try {
return new ProcessExecutor().command(javaBin, "-cp", classpath, className).readOutput(true)
.redirectOutput(System.out).destroyOnExit().redirectError(System.err).execute()
.getExitValue();
} catch (TimeoutException e) {
e.printStackTrace();
}
} else {
List<String> args2 = new ArrayList<>(
Arrays.asList(javaBin, "-cp", classpath, className, "-md", mediaDriverDirectory));
args2.addAll(Arrays.asList(args));
try {
new ProcessExecutor().command(args2).destroyOnExit().readOutput(true).redirectOutput(System.out)
.redirectError(System.err).execute().getExitValue();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
return 1;
}
}