You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2012/07/17 19:33:04 UTC
[13/50] git commit: stubbed out proposed clusterinfo changes
stubbed out proposed clusterinfo changes
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/30710fbd
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/30710fbd
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/30710fbd
Branch: refs/heads/vnodes
Commit: 30710fbd17007a6c0dce5db29ca757be5fcb9366
Parents: 1659c08
Author: Eric Evans <ee...@apache.org>
Authored: Tue Jul 17 12:33:20 2012 -0500
Committer: Eric Evans <ee...@apache.org>
Committed: Tue Jul 17 12:33:20 2012 -0500
----------------------------------------------------------------------
src/java/org/apache/cassandra/tools/NodeCmd.java | 174 +++++++++++++----
1 files changed, 140 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/30710fbd/src/java/org/apache/cassandra/tools/NodeCmd.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java
index 3ad6428..41fe3f8 100644
--- a/src/java/org/apache/cassandra/tools/NodeCmd.java
+++ b/src/java/org/apache/cassandra/tools/NodeCmd.java
@@ -38,12 +38,15 @@ import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.db.ColumnFamilyStoreMBean;
import org.apache.cassandra.db.compaction.CompactionManagerMBean;
import org.apache.cassandra.db.compaction.OperationType;
+import org.apache.cassandra.locator.EndpointSnitchInfo;
+import org.apache.cassandra.locator.EndpointSnitchInfoMBean;
import org.apache.cassandra.net.MessagingServiceMBean;
import org.apache.cassandra.service.CacheServiceMBean;
import org.apache.cassandra.service.StorageProxyMBean;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.utils.EstimatedHistogram;
import org.apache.cassandra.utils.Pair;
+import org.apache.rat.document.UnreadableArchiveException;
public class NodeCmd
{
@@ -337,54 +340,157 @@ public class NodeCmd
outs.println();
}
- /** Writes a table of cluster-wide node information to a PrintStream
- * @throws UnknownHostException */
- public void printClusterInfo(PrintStream outs, String keyspace) throws UnknownHostException
+ private class ClusterInfo
{
- Collection<String> joiningNodes = probe.getJoiningNodes();
- Collection<String> leavingNodes = probe.getLeavingNodes();
- Collection<String> movingNodes = probe.getMovingNodes();
- Map<String, String> loadMap = probe.getLoadMap();
+ String kSpace = null, format = null;
+ Collection<String> joiningNodes, leavingNodes, movingNodes, liveNodes, unreachableNodes;
+ Map<String, String> loadMap, hostIDMap, tokensToEndpoints;
+ EndpointSnitchInfoMBean epSnitchInfo;
+ PrintStream outs;
- String fmt;
+ ClusterInfo(PrintStream outs, String kSpace)
+ {
+ this.kSpace = kSpace;
+ this.outs = outs;
+ joiningNodes = probe.getJoiningNodes();
+ leavingNodes = probe.getLeavingNodes();
+ movingNodes = probe.getMovingNodes();
+ loadMap = probe.getLoadMap();
+ tokensToEndpoints = probe.getTokenToEndpointMap();
+ liveNodes = probe.getLiveNodes();
+ unreachableNodes = probe.getUnreachableNodes();
+ hostIDMap = probe.getHostIdMap();
+ epSnitchInfo = probe.getEndpointSnitchInfoProxy();
+ }
- // Calculate per-token ownership of the ring
- Map<InetAddress, Float> ownerships;
- try
+ private void printStatusLegend()
{
- ownerships = probe.effectiveOwnership(keyspace);
- fmt = "%-16s %-7s %-8s %-10s %-7s %-16s %s%n";
- outs.print(String.format(fmt, "Address", "Status", "State", "Load", "Tokens", "Owns (effective)", "Host ID"));
+ outs.println("Status=Up/Down");
+ outs.println("|/ State=Normal/Leaving/Joining/Moving");
}
- catch (ConfigurationException ex)
+
+ private Map<String, Map<InetAddress, Float>> getOwnershipByDc(Map<InetAddress, Float> ownerships)
+ throws UnknownHostException
{
- ownerships = probe.getOwnership();
- fmt = "%-16s %-7s %-8s %-10s %-7s %-7s %s%n";
- outs.printf("Warn: Ownership information does not include topology, please specify a keyspace. \n");
- outs.print(String.format(fmt, "Address", "Status", "State", "Load", "Tokens", "Owns", "Host ID"));
+ Map<String, Map<InetAddress, Float>> ownershipByDc = Maps.newLinkedHashMap();
+ EndpointSnitchInfoMBean epSnitchInfo = probe.getEndpointSnitchInfoProxy();
+
+ for (Map.Entry<InetAddress, Float> ownership : ownerships.entrySet())
+ {
+ String dc = epSnitchInfo.getDatacenter(ownership.getKey().getHostAddress());
+ if (!ownershipByDc.containsKey(dc))
+ ownershipByDc.put(dc, new LinkedHashMap<InetAddress, Float>());
+ ownershipByDc.get(dc).put(ownership.getKey(), ownership.getValue());
+ }
+
+ return ownershipByDc;
}
- for (Map.Entry<String, String> entry : probe.getHostIdMap().entrySet())
+ private String getFormat(boolean hasEffectiveOwns, boolean isTokenPerNode)
{
- String endpoint = entry.getKey();
+ if (format == null)
+ {
+ StringBuffer buf = new StringBuffer();
+ buf.append("%s%s %-16s %-8s "); // status, address, and load
+ if (!isTokenPerNode) buf.append("%-6s "); // "Tokens"
+ if (hasEffectiveOwns) buf.append("%-16s "); // "Owns (effective)"
+ else buf.append("%-5s "); // "Owns
+ buf.append("%-36s "); // Host ID
+ if (isTokenPerNode) buf.append("%-39s "); // token
+ buf.append("%s%n"); // "Rack"
+
+ format = buf.toString();
+ }
- String status;
- if (probe.getLiveNodes().contains(endpoint)) status = "Up";
- else if (probe.getUnreachableNodes().contains(endpoint)) status = "Down";
- else status = "?";
+ return format;
+ }
- String state;
- if (joiningNodes.contains(endpoint)) state = "Joining";
- else if (leavingNodes.contains(endpoint)) state = "Leaving";
- else if (movingNodes.contains(endpoint)) state = "Moving";
- else state = "Normal";
+ private void printNode(String endpoint, Float owns, Map<InetAddress, Float> ownerships,
+ boolean hasEffectiveOwns, boolean isTokenPerNode) throws UnknownHostException
+ {
+ String status, state, load, strOwns, hostID, rack, fmt;
+ fmt = getFormat(hasEffectiveOwns, isTokenPerNode);
+
+ if (liveNodes.contains(endpoint)) status = "U";
+ else if (unreachableNodes.contains(endpoint)) status = "D";
+ else status = "?";
+ if (joiningNodes.contains(endpoint)) state = "J";
+ else if (leavingNodes.contains(endpoint)) state = "L";
+ else if (movingNodes.contains(endpoint)) state = "M";
+ else state = "N";
+
+ load = loadMap.containsKey(endpoint) ? loadMap.get(endpoint) : "?";
+ strOwns = new DecimalFormat("##0.0%").format(ownerships.get(InetAddress.getByName(endpoint)));
+ hostID = hostIDMap.get(endpoint);
+ rack = epSnitchInfo.getRack(endpoint);
+
+ if (isTokenPerNode)
+ {
+ outs.printf(fmt, status, state, endpoint, load, strOwns, hostID, probe.getTokens(endpoint).get(0), rack);
+ }
+ else
+ {
+ int tokens = probe.getTokens(endpoint).size();
+ outs.printf(fmt, status, state, endpoint, load, tokens, strOwns, hostID, rack);
+ }
+ }
- String load = loadMap.containsKey(endpoint) ? loadMap.get(endpoint) : "?";
+ private void printNodesHeader(boolean hasEffectiveOwns, boolean isTokenPerNode)
+ {
+ String fmt = getFormat(hasEffectiveOwns, isTokenPerNode);
+ String owns = hasEffectiveOwns ? "Owns (effective)" : "Owns";
- String strOwns = new DecimalFormat("##0.00%").format(ownerships.get(InetAddress.getByName(endpoint)));
- int numTokens = probe.getTokens(endpoint).size();
- outs.print(String.format(fmt, endpoint, status, state, load, numTokens, strOwns, entry.getValue()));
+ if (isTokenPerNode)
+ outs.printf(fmt, "+", "+", "Address", "Load", owns, "Host ID", "Token", "Rack");
+ else
+ outs.printf(fmt, "+", "+", "Address", "Load", "Tokens", owns, "Host ID", "Rack");
}
+
+ void print() throws UnknownHostException
+ {
+ Map<InetAddress, Float> ownerships;
+ boolean hasEffectiveOwns = false, isTokenPerNode = true;
+ try
+ {
+ ownerships = probe.effectiveOwnership(kSpace);
+ hasEffectiveOwns = true;
+ }
+ catch (ConfigurationException e)
+ {
+ ownerships = probe.getOwnership();
+ }
+
+ // More tokens then nodes (aka vnodes)?
+ if (new HashSet<String>(tokensToEndpoints.values()).size() < tokensToEndpoints.keySet().size())
+ isTokenPerNode = false;
+
+ // Datacenters
+ for (Map.Entry<String, Map<InetAddress, Float>> dc : getOwnershipByDc(ownerships).entrySet())
+ {
+ String dcHeader = String.format("Datacenter: %s%n", dc.getKey());
+ outs.printf(dcHeader);
+ for (int i=0; i < (dcHeader.length() - 1); i++) outs.print('=');
+ outs.println();
+
+ printStatusLegend();
+ printNodesHeader(hasEffectiveOwns, isTokenPerNode);
+
+ // Nodes
+ for (Map.Entry<InetAddress, Float> entry : dc.getValue().entrySet())
+ printNode(entry.getKey().getHostAddress(),
+ entry.getValue(),
+ ownerships,
+ hasEffectiveOwns,
+ isTokenPerNode);
+ }
+ }
+ }
+
+ /** Writes a table of cluster-wide node information to a PrintStream
+ * @throws UnknownHostException */
+ public void printClusterInfo(PrintStream outs, String keyspace) throws UnknownHostException
+ {
+ new ClusterInfo(outs, keyspace).print();
}
public void printThreadPoolStats(PrintStream outs)