package voldemort.utils; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.apache.commons.io.FileUtils; import voldemort.ServerTestUtils; import voldemort.TestUtils; import voldemort.cluster.Cluster; import voldemort.cluster.Node; import voldemort.server.VoldemortConfig; import voldemort.store.socket.SocketStoreFactory; import voldemort.xml.ClusterMapper; /** * Helper function to start/stop manage a Voldemort Server in a JVM. * * */ public class ServerJVMTestUtils { public static Process startServerJVM(SocketStoreFactory socketStoreFactory, Node node, String voldemortHome) throws IOException { List<String> env = Arrays.asList("CLASSPATH=" + System.getProperty("java.class.path")); String command = "java voldemort.server.VoldemortServer " + voldemortHome; // System.out.println("command:" + command + " env:" + env); Process process = Runtime.getRuntime().exec(command, env.toArray(new String[0])); ServerTestUtils.waitForServerStart(socketStoreFactory, node); startOutputErrorConsumption(process); return process; } public static void startOutputErrorConsumption(final Process process) { final InputStream io = new BufferedInputStream(process.getInputStream()); new Thread(new Runnable() { public void run() { while(true) { try { process.exitValue(); try { io.close(); } catch(IOException e) { e.printStackTrace(); } return; } catch(IllegalThreadStateException e) { // still running StringBuffer buffer = new StringBuffer(); try { int c; while((c = io.read()) != -1) { buffer.append((char) c); } } catch(Exception e1) { return; } finally { System.out.println(buffer.toString()); } } } } }).start(); } public static void StopServerJVM(Process server) { System.out.println("killing process" + server); server.destroy(); try { server.waitFor(); } catch(InterruptedException e) { throw new RuntimeException(e); } } public static String createAndInitializeVoldemortHome(boolean useNio, int node, String storesXmlfile, Cluster cluster) throws IOException { VoldemortConfig config = ServerTestUtils.createServerConfig(useNio, node, TestUtils.createTempDir() .getAbsolutePath(), null, storesXmlfile, new Properties()); // Initialize voldemort config dir with all required files. // cluster.xml File clusterXml = new File(config.getMetadataDirectory() + File.separator + "cluster.xml"); FileUtils.writeStringToFile(clusterXml, new ClusterMapper().writeCluster(cluster)); // stores.xml File storesXml = new File(config.getMetadataDirectory() + File.separator + "stores.xml"); FileUtils.copyFile(new File(storesXmlfile), storesXml); // server.properties File serverProperties = new File(config.getMetadataDirectory() + File.separator + "server.properties"); FileUtils.writeLines(serverProperties, Arrays.asList("node.id=" + node, "bdb.cache.size=" + 1024 * 1024, "enable.metadata.checking=" + false, "enable.network.classloader=" + false)); return config.getVoldemortHome(); } }