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

clohfink pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new d6c049f  Fix error with non-existent table for nodetool tablehistograms
d6c049f is described below

commit d6c049f0835f137fc07711ec5cf9adc323347c65
Author: Hannu Kroger <hkro...@gmail.com>
AuthorDate: Thu Aug 8 11:02:15 2019 -0700

    Fix error with non-existent table for nodetool tablehistograms
    
    Patch by Hannu Kroger; reviewed by Chris Lohfink for CASSANDRA-14410
---
 CHANGES.txt                                        |  1 +
 .../cassandra/tools/nodetool/TableHistograms.java  | 50 +++++++++++++---------
 2 files changed, 30 insertions(+), 21 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index c9adf59..1d0e11d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0
+ * Fix error with non-existent table for nodetool tablehistograms 
(CASSANDRA-14410)
  * Catch non-IOException in FileUtils.close to make sure that all resources 
are closed (CASSANDRA-15225)
  * Align load column in nodetool status output (CASSANDRA-14787)
  * CassandraNetworkAuthorizer uses cached roles info (CASSANDRA-15089)
diff --git a/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java 
b/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java
index f24c8a3..cb3b946 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java
@@ -23,17 +23,19 @@ import io.airlift.airline.Arguments;
 import io.airlift.airline.Command;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
 import org.apache.cassandra.db.ColumnFamilyStoreMBean;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 import org.apache.cassandra.utils.EstimatedHistogram;
+
 import org.apache.commons.lang3.ArrayUtils;
 
 @Command(name = "tablehistograms", description = "Print statistic histograms 
for a given table")
@@ -45,40 +47,46 @@ public class TableHistograms extends NodeToolCmd
     @Override
     public void execute(NodeProbe probe)
     {
-        Map<String, List<String>> tablesList = new HashMap<>();
+        Multimap<String, String> tablesList = HashMultimap.create();
+
+        // a <keyspace, set<table>> mapping for verification or as reference 
if none provided
+        Multimap<String, String> allTables = HashMultimap.create();
+        Iterator<Map.Entry<String, ColumnFamilyStoreMBean>> tableMBeans = 
probe.getColumnFamilyStoreMBeanProxies();
+        while (tableMBeans.hasNext())
+        {
+            Map.Entry<String, ColumnFamilyStoreMBean> entry = 
tableMBeans.next();
+            allTables.put(entry.getKey(), entry.getValue().getTableName());
+        }
+
         if (args.size() == 2)
         {
-            tablesList.put(args.get(0), new 
ArrayList<String>(Arrays.asList(args.get(1))));
+            tablesList.put(args.get(0), args.get(1));
         }
         else if (args.size() == 1)
         {
             String[] input = args.get(0).split("\\.");
             checkArgument(input.length == 2, "tablehistograms requires 
keyspace and table name arguments");
-            tablesList.put(input[0], new 
ArrayList<String>(Arrays.asList(input[1])));
+            tablesList.put(input[0], input[1]);
         }
         else
         {
-            // get a list of table stores
-            Iterator<Map.Entry<String, ColumnFamilyStoreMBean>> tableMBeans = 
probe.getColumnFamilyStoreMBeanProxies();
-            while (tableMBeans.hasNext())
+            // use all tables
+            tablesList = allTables;
+        }
+
+        // verify that all tables to list exist
+        for (String keyspace : tablesList.keys())
+        {
+            for (String table : tablesList.get(keyspace))
             {
-                Map.Entry<String, ColumnFamilyStoreMBean> entry = 
tableMBeans.next();
-                String keyspaceName = entry.getKey();
-                ColumnFamilyStoreMBean tableProxy = entry.getValue();
-                if (!tablesList.containsKey(keyspaceName))
-                {
-                    tablesList.put(keyspaceName, new ArrayList<String>());
-                }
-                tablesList.get(keyspaceName).add(tableProxy.getTableName());
+                if (!allTables.containsEntry(keyspace, table))
+                    throw new IllegalArgumentException("Unknown table " + 
keyspace + '.' + table);
             }
         }
 
-        Iterator<Map.Entry<String, List<String>>> iter = 
tablesList.entrySet().iterator();
-        while(iter.hasNext())
+        for (String keyspace : tablesList.keys())
         {
-            Map.Entry<String, List<String>> entry = iter.next();
-            String keyspace = entry.getKey();
-            for (String table : entry.getValue())
+            for (String table : tablesList.get(keyspace))
             {
                 // calculate percentile of row size and column count
                 long[] estimatedPartitionSize = (long[]) 
probe.getColumnFamilyMetric(keyspace, table, "EstimatedPartitionSizeHistogram");


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

Reply via email to