Skip to content

Instantly share code, notes, and snippets.

@rsumbaly
Created January 4, 2011 23:07
Show Gist options
  • Save rsumbaly/765628 to your computer and use it in GitHub Desktop.
Save rsumbaly/765628 to your computer and use it in GitHub Desktop.
package voldemort;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import voldemort.cluster.Cluster;
import voldemort.cluster.Node;
import voldemort.xml.ClusterMapper;
import com.google.common.collect.Lists;
public class UpdateXml {
public static void main(String args[]) throws IOException {
if(args.length != 2) {
System.err.println("<cluster.xml_path>");
System.exit(-1);
}
String clusterXmlPath = args[0];
File clusterXml = new File(clusterXmlPath);
File parentDir = clusterXml.getParentFile();
String directoryName = clusterXml.getParentFile().getName();
if(!clusterXml.exists()) {
System.err.println("<cluster.xml_path> <stores.xml_path>");
System.exit(-1);
}
ClusterMapper clusterMapper = new ClusterMapper();
Cluster cluster = clusterMapper.readCluster(clusterXml);
if(cluster.getZones().size() != 2) {
System.err.println("Cluster should have two zones");
System.exit(-1);
}
// Generate the number of nodes
List<Node> newNodes = getBestNodes(cluster);
Cluster newCluster = new Cluster(cluster.getName(),
newNodes,
Lists.newArrayList(cluster.getZones()));
File newClusterXml = new File(parentDir, directoryName + "_cluster.xml");
String clusterString = clusterMapper.writeCluster(newCluster);
FileOutputStream stream = new FileOutputStream(newClusterXml);
stream.write(clusterString.getBytes());
stream.close();
}
private static List<Node> getBestNodes(Cluster cluster) {
List<Node> newNodes = Lists.newArrayList();
int nodesInSingleZone = cluster.getNumberOfNodes() / 2;
for(int nodeId = 0; nodeId < nodesInSingleZone; nodeId++) {
List<Integer> partitions = Lists.newArrayList();
partitions.addAll(cluster.getNodeById(nodeId).getPartitionIds());
partitions.addAll(cluster.getNodeById(nodeId + nodesInSingleZone).getPartitionIds());
Collections.shuffle(partitions);
List<Integer> partitionsNode1 = partitions.subList(0, partitions.size() / 2);
List<Integer> partitionsNode2 = partitions.subList(partitions.size() / 2,
partitions.size());
newNodes.add(new Node(cluster.getNodeById(nodeId).getId(),
cluster.getNodeById(nodeId).getHost(),
cluster.getNodeById(nodeId).getHttpPort(),
cluster.getNodeById(nodeId).getSocketPort(),
cluster.getNodeById(nodeId).getAdminPort(),
cluster.getNodeById(nodeId).getZoneId(),
partitionsNode1));
newNodes.add(new Node(cluster.getNodeById(nodeId + nodesInSingleZone).getId(),
cluster.getNodeById(nodeId + nodesInSingleZone).getHost(),
cluster.getNodeById(nodeId + nodesInSingleZone).getHttpPort(),
cluster.getNodeById(nodeId + nodesInSingleZone).getSocketPort(),
cluster.getNodeById(nodeId + nodesInSingleZone).getAdminPort(),
cluster.getNodeById(nodeId + nodesInSingleZone).getZoneId(),
partitionsNode2));
}
return newNodes;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment