use of voldemort.cluster.Zone in project voldemort by voldemort.
the class ServerTestUtils method getLocalZonedCluster.
/**
* Returns a cluster with <b>numberOfNodes</b> nodes in <b>numberOfZones</b>
* zones. It is important that <b>numberOfNodes</b> be divisible by
* <b>numberOfZones</b>
*
* @param numberOfNodes Number of nodes in the cluster
* @param partitionsPerNode Number of partitions in one node
* @param numberOfZones Number of zones
* @return Cluster
*/
public static Cluster getLocalZonedCluster(int numberOfNodes, int numberOfZones, int[] nodeToZoneMapping, int[][] partitionMapping, int[] ports) {
List<Node> nodes = new ArrayList<Node>();
for (int i = 0; i < numberOfNodes; i++) {
List<Integer> partitions = new ArrayList<Integer>(partitionMapping[i].length);
for (int p : partitionMapping[i]) {
partitions.add(p);
}
nodes.add(new Node(i, "localhost", ports[3 * i], ports[3 * i + 1], ports[3 * i + 2], nodeToZoneMapping[i], partitions));
}
// Generate zones
List<Zone> zones = getZones(numberOfZones);
return new Cluster("cluster", nodes, zones);
}
use of voldemort.cluster.Zone in project voldemort by voldemort.
the class VoldemortAdminTool method executeShowRoutingPlan.
private static void executeShowRoutingPlan(AdminClient adminClient, String storeName, List<String> keyList) throws DecoderException {
Cluster cluster = adminClient.getAdminClientCluster();
List<StoreDefinition> storeDefs = adminClient.metadataMgmtOps.getRemoteStoreDefList().getValue();
StoreDefinition storeDef = StoreDefinitionUtils.getStoreDefinitionWithName(storeDefs, storeName);
StoreRoutingPlan routingPlan = new StoreRoutingPlan(cluster, storeDef);
BaseStoreRoutingPlan bRoutingPlan = new BaseStoreRoutingPlan(cluster, storeDef);
final int COLUMN_WIDTH = 30;
for (String keyStr : keyList) {
byte[] key = ByteUtils.fromHexString(keyStr);
System.out.println("Key :" + keyStr);
System.out.println("Replicating Partitions :" + routingPlan.getReplicatingPartitionList(key));
System.out.println("Replicating Nodes :");
List<Integer> nodeList = routingPlan.getReplicationNodeList(routingPlan.getMasterPartitionId(key));
for (int i = 0; i < nodeList.size(); i++) {
System.out.println(nodeList.get(i) + "\t" + cluster.getNodeById(nodeList.get(i)).getHost());
}
System.out.println("Zone Nary information :");
HashMap<Integer, Integer> zoneRepMap = storeDef.getZoneReplicationFactor();
for (Zone zone : cluster.getZones()) {
System.out.println("\tZone #" + zone.getId());
int numReplicas = -1;
if (zoneRepMap == null) {
// non zoned cluster
numReplicas = storeDef.getReplicationFactor();
} else {
// zoned cluster
if (!zoneRepMap.containsKey(zone.getId())) {
Utils.croak("Repfactor for Zone " + zone.getId() + " not found in storedef");
}
numReplicas = zoneRepMap.get(zone.getId());
}
String FormatString = "%s %s %s\n";
System.out.format(FormatString, Utils.paddedString("REPLICA#", COLUMN_WIDTH), Utils.paddedString("PARTITION", COLUMN_WIDTH), Utils.paddedString("NODE", COLUMN_WIDTH));
for (int i = 0; i < numReplicas; i++) {
Integer nodeId = bRoutingPlan.getNodeIdForZoneNary(zone.getId(), i, key);
Integer partitionId = routingPlan.getNodesPartitionIdForKey(nodeId, key);
System.out.format(FormatString, Utils.paddedString(i + "", COLUMN_WIDTH), Utils.paddedString(partitionId.toString(), COLUMN_WIDTH), Utils.paddedString(nodeId + "(" + cluster.getNodeById(nodeId).getHost() + ")", COLUMN_WIDTH));
}
System.out.println();
}
System.out.println("-----------------------------------------------");
System.out.println();
}
}
use of voldemort.cluster.Zone in project voldemort by voldemort.
the class PartitionBalanceUtils method verboseClusterDump.
/**
* Prints the details of cluster xml in various formats. Some information is
* repeated in different forms. This is intentional so that it is easy to
* find the specific view of the cluster xml that you want.
*
* @param cluster
* @return pretty string of cluster balance
*/
public static String verboseClusterDump(final Cluster cluster) {
StringBuilder builder = new StringBuilder();
builder.append("CLUSTER XML SUMMARY\n");
Map<Integer, Integer> zoneIdToPartitionCount = Maps.newHashMap();
Map<Integer, Integer> zoneIdToNodeCount = Maps.newHashMap();
for (Zone zone : cluster.getZones()) {
zoneIdToPartitionCount.put(zone.getId(), 0);
zoneIdToNodeCount.put(zone.getId(), 0);
}
for (Node node : cluster.getNodes()) {
zoneIdToPartitionCount.put(node.getZoneId(), zoneIdToPartitionCount.get(node.getZoneId()) + node.getNumberOfPartitions());
zoneIdToNodeCount.put(node.getZoneId(), zoneIdToNodeCount.get(node.getZoneId()) + 1);
}
builder.append("\n");
builder.append("Number of partitions per zone:\n");
for (Zone zone : cluster.getZones()) {
builder.append("\tZone: " + zone.getId() + " - " + zoneIdToPartitionCount.get(zone.getId()) + "\n");
}
builder.append("\n");
builder.append("Number of nodes per zone:\n");
for (Zone zone : cluster.getZones()) {
builder.append("\tZone: " + zone.getId() + " - " + zoneIdToNodeCount.get(zone.getId()) + "\n");
}
builder.append("\n");
builder.append("Nodes in each zone:\n");
for (Zone zone : cluster.getZones()) {
builder.append("\tZone: " + zone.getId() + " - " + cluster.getNodeIdsInZone(zone.getId()) + "\n");
}
builder.append("\n");
builder.append("Number of partitions per node:\n");
for (Node node : cluster.getNodes()) {
builder.append("\tNode ID: " + node.getId() + " - " + node.getNumberOfPartitions() + " (" + node.getHost() + ")\n");
}
builder.append("\n");
if (cluster.getZones().size() > 1) {
builder.append("ZONE-PARTITION SUMMARY:\n");
builder.append("\n");
builder.append("Partitions in each zone:\n");
for (Zone zone : cluster.getZones()) {
builder.append("\tZone: " + zone.getId() + " - " + compressedListOfPartitionsInZone(cluster, zone.getId()) + "\n");
}
builder.append("\n");
builder.append("Contiguous partition run lengths in each zone ('{run length : count}'):\n");
for (Zone zone : cluster.getZones()) {
builder.append("\tZone: " + zone.getId() + " - " + getPrettyMapOfContiguousPartitionRunLengths(cluster, zone.getId()) + "\n");
}
builder.append("\n");
builder.append("The following nodes have hot partitions:\n");
builder.append(getHotPartitionsDueToContiguity(cluster, 5));
builder.append("\n");
}
return builder.toString();
}
use of voldemort.cluster.Zone in project voldemort by voldemort.
the class RebalanceUtils method dropZone.
/**
* Given a interim cluster with a previously vacated zone, constructs a new
* cluster object with the drop zone completely removed
*
* @param intermediateCluster
* @param dropZoneId
* @return adjusted cluster with the zone dropped
*/
public static Cluster dropZone(Cluster intermediateCluster, int dropZoneId) {
// Filter out nodes that don't belong to the zone being dropped
Set<Node> survivingNodes = new HashSet<Node>();
for (int nodeId : intermediateCluster.getNodeIds()) {
if (intermediateCluster.getNodeById(nodeId).getZoneId() != dropZoneId) {
survivingNodes.add(intermediateCluster.getNodeById(nodeId));
}
}
// Filter out dropZoneId from all zones
Set<Zone> zones = new HashSet<Zone>();
for (int zoneId : intermediateCluster.getZoneIds()) {
if (zoneId == dropZoneId) {
continue;
}
List<Integer> proximityList = intermediateCluster.getZoneById(zoneId).getProximityList();
proximityList.remove(new Integer(dropZoneId));
zones.add(new Zone(zoneId, proximityList));
}
return new Cluster(intermediateCluster.getName(), Utils.asSortedList(survivingNodes), Utils.asSortedList(zones));
}
use of voldemort.cluster.Zone in project voldemort by voldemort.
the class RebalanceUtils method validateClusterZonesSame.
/**
* Confirms that both clusters have the same set of zones defined.
*
* @param lhs
* @param rhs
*/
public static void validateClusterZonesSame(final Cluster lhs, final Cluster rhs) {
Set<Zone> lhsSet = new HashSet<Zone>(lhs.getZones());
Set<Zone> rhsSet = new HashSet<Zone>(rhs.getZones());
if (!lhsSet.equals(rhsSet))
throw new VoldemortException("Zones are not the same [ lhs cluster zones (" + lhs.getZones() + ") not equal to rhs cluster zones (" + rhs.getZones() + ") ]");
}
Aggregations