public void execute()

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);
    }