in src/java/org/apache/cassandra/tools/nodetool/Status.java [84:215]
public void execute(NodeProbe probe)
{
PrintStream out = probe.output().out;
PrintStream errOut = probe.output().err;
SortBy sortBy = parseSortBy(this.sortBy, errOut);
SortOrder sortOrder = parseSortOrder(this.sortOrder, errOut);
joiningNodes = probe.getJoiningNodes(true);
leavingNodes = probe.getLeavingNodes(true);
movingNodes = probe.getMovingNodes(true);
loadMap = probe.getLoadMap(true);
Map<String, String> tokensToEndpoints = probe.getTokenToEndpointMap(true);
liveNodes = probe.getLiveNodes(true);
unreachableNodes = probe.getUnreachableNodes(true);
hostIDMap = probe.getHostIdMap(true);
epSnitchInfo = probe.getEndpointSnitchInfoProxy();
StringBuilder errors = new StringBuilder();
TableBuilder.SharedTable sharedTable = new TableBuilder.SharedTable(" ");
Map<String, Float> ownerships = null;
boolean hasEffectiveOwns = false;
try
{
ownerships = probe.effectiveOwnershipWithPort(keyspace);
hasEffectiveOwns = true;
}
catch (IllegalStateException e)
{
try
{
ownerships = probe.getOwnershipWithPort();
errors.append("Note: ").append(e.getMessage()).append("%n");
}
catch (Exception ex)
{
errOut.printf("%nError: %s%n", ex.getMessage());
System.exit(1);
}
}
catch (IllegalArgumentException ex)
{
errOut.printf("%nError: %s%n", ex.getMessage());
System.exit(1);
}
SortedMap<String, SetHostStatWithPort> dcs = NodeTool.getOwnershipByDcWithPort(probe, resolveIp, tokensToEndpoints, ownerships);
int nodesOfTokens = tokensToEndpoints.values().size();
// More tokens than nodes (aka vnodes)?
if (hostIDMap.size() < nodesOfTokens)
isTokenPerNode = false;
if (sortBy == null)
{
if (isTokenPerNode)
sortBy = SortBy.token;
else
sortBy = SortBy.id;
}
else if (!isTokenPerNode && sortBy == SortBy.token)
{
errOut.printf("%nError: Can not sort by token when there is not token per node.%n");
System.exit(1);
}
else if (!resolveIp && sortBy == SortBy.host)
{
errOut.printf("%nError: Can not sort by host when there is not -r/--resolve-ip flag used.%n");
System.exit(1);
}
// Datacenters
for (Map.Entry<String, SetHostStatWithPort> dc : dcs.entrySet())
{
TableBuilder tableBuilder = sharedTable.next();
addNodesHeader(hasEffectiveOwns, tableBuilder);
ArrayListMultimap<InetAddressAndPort, HostStatWithPort> hostToTokens = ArrayListMultimap.create();
for (HostStatWithPort stat : dc.getValue())
hostToTokens.put(stat.endpointWithPort, stat);
Map<String, List<Object>> data = new HashMap<>();
for (InetAddressAndPort endpoint : hostToTokens.keySet())
{
Float owns = ownerships.get(endpoint.getHostAddressAndPort());
List<HostStatWithPort> tokens = hostToTokens.get(endpoint);
HostStatWithPort hostStatWithPort = tokens.get(0);
String epDns = hostStatWithPort.ipOrDns(printPort);
List<Object> nodeData = addNode(epDns, endpoint, owns, hostStatWithPort, tokens.size(), hasEffectiveOwns);
data.put(epDns, nodeData);
}
for (Map.Entry<String, List<Object>> entry : sortBy.tokenPerNode(isTokenPerNode)
.sortOrder(sortOrder)
.sort(data)
.entrySet())
{
List<Object> values = entry.getValue();
List<String> row = new ArrayList<>();
for (int i = 1; i < values.size(); i++)
row.add((String) values.get(i));
tableBuilder.add(row);
}
}
Iterator<TableBuilder> results = sharedTable.complete().iterator();
boolean first = true;
for (Map.Entry<String, SetHostStatWithPort> dc : dcs.entrySet())
{
if (!first)
{
out.println();
}
first = false;
String dcHeader = String.format("Datacenter: %s%n", dc.getKey());
out.print(dcHeader);
for (int i = 0; i < (dcHeader.length() - 1); i++) out.print('=');
out.println();
// Legend
out.println("Status=Up/Down");
out.println("|/ State=Normal/Leaving/Joining/Moving");
TableBuilder dcTable = results.next();
dcTable.printTo(out);
}
out.printf("%n" + errors);
}