Fix nodetool ring and status output format for ipv6 addresses
Patch by Michal Michalsky, reviewed by brandonwilliams for
CASSANDRA-5302


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/f3a93f95
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/f3a93f95
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/f3a93f95

Branch: refs/heads/trunk
Commit: f3a93f95ba1374986ea6d4ed12a84b888d22aa94
Parents: c1332ef
Author: Brandon Williams <brandonwilli...@apache.org>
Authored: Wed Mar 20 10:45:09 2013 -0500
Committer: Brandon Williams <brandonwilli...@apache.org>
Committed: Wed Mar 20 10:45:09 2013 -0500

----------------------------------------------------------------------
 src/java/org/apache/cassandra/tools/NodeCmd.java |   33 ++++++++++++++++-
 1 files changed, 31 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f3a93f95/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 8cd8b56..9d113a6 100644
--- a/src/java/org/apache/cassandra/tools/NodeCmd.java
+++ b/src/java/org/apache/cassandra/tools/NodeCmd.java
@@ -212,7 +212,16 @@ public class NodeCmd
         for (Map.Entry<String, String> entry : tokensToEndpoints.entrySet())
             endpointsToTokens.put(entry.getValue(), entry.getKey());
 
-        String format = "%-16s%-12s%-7s%-8s%-16s%-20s%-44s%n";
+        int maxAddressLength = Collections.max(endpointsToTokens.keys(), new 
Comparator<String>() {
+            @Override
+            public int compare(String first, String second)
+            {
+                return 
((Integer)first.length()).compareTo((Integer)second.length());
+            }
+        }).length();
+
+        String formatPlaceholder = "%%-%ds  
%%-12s%%-7s%%-8s%%-16s%%-20s%%-44s%%n";
+        String format = String.format(formatPlaceholder, maxAddressLength);
 
         // Calculate per-token ownership of the ring
         Map<InetAddress, Float> ownerships;
@@ -328,6 +337,7 @@ public class NodeCmd
     private class ClusterStatus
     {
         String kSpace = null, format = null;
+        int maxAddressLength;
         Collection<String> joiningNodes, leavingNodes, movingNodes, liveNodes, 
unreachableNodes;
         Map<String, String> loadMap, hostIDMap, tokensToEndpoints;
         EndpointSnitchInfoMBean epSnitchInfo;
@@ -376,7 +386,10 @@ public class NodeCmd
             if (format == null)
             {
                 StringBuffer buf = new StringBuffer();
-                buf.append("%s%s  %-16s  %-9s  ");            // status, 
address, and load
+                String addressPlaceholder = String.format("%%-%ds  ", 
maxAddressLength);
+                buf.append("%s%s  ");                         // status
+                buf.append(addressPlaceholder);               // address
+                buf.append("%-9s  ");                         // load
                 if (!isTokenPerNode)  buf.append("%-6s  ");   // "Tokens"
                 if (hasEffectiveOwns) buf.append("%-16s  ");  // "Owns 
(effective)"
                 else                  buf.append("%-5s  ");   // "Owns
@@ -435,6 +448,7 @@ public class NodeCmd
         {
             Map<InetAddress, Float> ownerships;
             boolean hasEffectiveOwns = false, isTokenPerNode = true;
+
             try
             {
                 ownerships = probe.effectiveOwnership(kSpace);
@@ -449,6 +463,21 @@ public class NodeCmd
             if (new HashSet<String>(tokensToEndpoints.values()).size() < 
tokensToEndpoints.keySet().size())
                 isTokenPerNode = false;
 
+            maxAddressLength = 0;
+            for (Map.Entry<String, Map<InetAddress, Float>> dc : 
getOwnershipByDc(ownerships).entrySet())
+            {
+                int dcMaxAddressLength = 
Collections.max(dc.getValue().keySet(), new Comparator<InetAddress>() {
+                    @Override
+                    public int compare(InetAddress first, InetAddress second)
+                    {
+                        return 
((Integer)first.getHostAddress().length()).compareTo((Integer)second.getHostAddress().length());
+                    }
+                }).getHostAddress().length();
+
+                if(dcMaxAddressLength > maxAddressLength)
+                    maxAddressLength = dcMaxAddressLength;
+            }
+
             // Datacenters
             for (Map.Entry<String, Map<InetAddress, Float>> dc : 
getOwnershipByDc(ownerships).entrySet())
             {

Reply via email to