This is an automated email from the ASF dual-hosted git repository.

aleksey pushed a commit to branch cassandra-3.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-3.0 by this push:
     new d7d0003  Improve `nodetool status -r` speed
d7d0003 is described below

commit d7d00036e7bc49ceb7da7971e39063733ce50136
Author: Fumiya Yamashita <fyama...@yahoo-corp.jp>
AuthorDate: Tue Feb 12 17:03:26 2019 -0800

    Improve `nodetool status -r` speed
    
    patch by Fumiya Yamashita; reviewed by Dinesh Joshi for CASSANDRA-14847
    
    Co-authored-by: Fumiya Yamashita <fyama...@yahoo-corp.jp>
    Co-authored-by: Dinesh A. Joshi <dinesh.jo...@apple.com>
---
 CHANGES.txt                                        |  1 +
 .../apache/cassandra/tools/nodetool/Status.java    | 45 +++++++++++-----------
 2 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index b755751..fb71bf5 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.0.19
+ * Improve `nodetool status -r` speed (CASSANDRA-14847)
  * Improve merkle tree size and time on heap (CASSANDRA-14096)
  * Add missing commands to nodetool-completion (CASSANDRA-14916)
  * Anti-compaction temporarily corrupts sstable state for readers 
(CASSANDRA-15004)
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Status.java 
b/src/java/org/apache/cassandra/tools/nodetool/Status.java
index 99f745d..091040b 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Status.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Status.java
@@ -25,8 +25,10 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.text.DecimalFormat;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.SortedMap;
 
 import org.apache.cassandra.locator.EndpointSnitchInfoMBean;
@@ -46,7 +48,6 @@ public class Status extends NodeToolCmd
     private boolean resolveIp = false;
 
     private boolean isTokenPerNode = true;
-    private int maxAddressLength = 0;
     private String format = null;
     private Collection<String> joiningNodes, leavingNodes, movingNodes, 
liveNodes, unreachableNodes;
     private Map<String, String> loadMap, hostIDMap;
@@ -91,13 +92,13 @@ public class Status extends NodeToolCmd
         if (dcs.values().size() < tokensToEndpoints.keySet().size())
             isTokenPerNode = false;
 
-        findMaxAddressLength(dcs);
+        int maxAddressLength = computeMaxAddressLength(dcs);
 
         // Datacenters
         for (Map.Entry<String, SetHostStat> dc : dcs.entrySet())
         {
             String dcHeader = String.format("Datacenter: %s%n", dc.getKey());
-            System.out.printf(dcHeader);
+            System.out.print(dcHeader);
             for (int i = 0; i < (dcHeader.length() - 1); i++) 
System.out.print('=');
             System.out.println();
 
@@ -105,7 +106,7 @@ public class Status extends NodeToolCmd
             System.out.println("Status=Up/Down");
             System.out.println("|/ State=Normal/Leaving/Joining/Moving");
 
-            printNodesHeader(hasEffectiveOwns, isTokenPerNode);
+            printNodesHeader(hasEffectiveOwns, isTokenPerNode, 
maxAddressLength);
 
             ArrayListMultimap<InetAddress, HostStat> hostToTokens = 
ArrayListMultimap.create();
             for (HostStat stat : dc.getValue())
@@ -115,29 +116,30 @@ public class Status extends NodeToolCmd
             {
                 Float owns = ownerships.get(endpoint);
                 List<HostStat> tokens = hostToTokens.get(endpoint);
-                printNode(endpoint.getHostAddress(), owns, tokens, 
hasEffectiveOwns, isTokenPerNode);
+                printNode(endpoint.getHostAddress(), owns, tokens, 
hasEffectiveOwns, isTokenPerNode, maxAddressLength);
             }
         }
 
-        System.out.printf("%n" + errors.toString());
+        System.out.printf("%n" + errors);
 
     }
 
-    private void findMaxAddressLength(Map<String, SetHostStat> dcs)
+    private int computeMaxAddressLength(Map<String, SetHostStat> dcs)
     {
-        maxAddressLength = 0;
-        for (Map.Entry<String, SetHostStat> dc : dcs.entrySet())
-        {
-            for (HostStat stat : dc.getValue())
-            {
-                maxAddressLength = Math.max(maxAddressLength, 
stat.ipOrDns().length());
-            }
-        }
+        int maxAddressLength = 0;
+
+        Set<InetAddress> seenHosts = new HashSet<>();
+        for (SetHostStat stats : dcs.values())
+            for (HostStat stat : stats)
+                if (seenHosts.add(stat.endpoint))
+                    maxAddressLength = Math.max(maxAddressLength, 
stat.ipOrDns().length());
+
+        return maxAddressLength;
     }
 
-    private void printNodesHeader(boolean hasEffectiveOwns, boolean 
isTokenPerNode)
+    private void printNodesHeader(boolean hasEffectiveOwns, boolean 
isTokenPerNode, int maxAddressLength)
     {
-        String fmt = getFormat(hasEffectiveOwns, isTokenPerNode);
+        String fmt = getFormat(hasEffectiveOwns, isTokenPerNode, 
maxAddressLength);
         String owns = hasEffectiveOwns ? "Owns (effective)" : "Owns";
 
         if (isTokenPerNode)
@@ -146,10 +148,11 @@ public class Status extends NodeToolCmd
             System.out.printf(fmt, "-", "-", "Address", "Load", "Tokens", 
owns, "Host ID", "Rack");
     }
 
-    private void printNode(String endpoint, Float owns, List<HostStat> tokens, 
boolean hasEffectiveOwns, boolean isTokenPerNode)
+    private void printNode(String endpoint, Float owns, List<HostStat> tokens, 
boolean hasEffectiveOwns,
+                           boolean isTokenPerNode, int maxAddressLength)
     {
         String status, state, load, strOwns, hostID, rack, fmt;
-        fmt = getFormat(hasEffectiveOwns, isTokenPerNode);
+        fmt = getFormat(hasEffectiveOwns, isTokenPerNode, maxAddressLength);
         if (liveNodes.contains(endpoint)) status = "U";
         else if (unreachableNodes.contains(endpoint)) status = "D";
         else status = "?";
@@ -177,9 +180,7 @@ public class Status extends NodeToolCmd
             System.out.printf(fmt, status, state, endpointDns, load, 
tokens.size(), strOwns, hostID, rack);
     }
 
-    private String getFormat(
-            boolean hasEffectiveOwns,
-            boolean isTokenPerNode)
+    private String getFormat(boolean hasEffectiveOwns, boolean isTokenPerNode, 
int maxAddressLength)
     {
         if (format == null)
         {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to