You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/11/17 01:01:44 UTC

svn commit: r1035864 - in /cassandra/branches/cassandra-0.7: ./ interface/thrift/gen-java/org/apache/cassandra/thrift/ src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/tools/

Author: jbellis
Date: Wed Nov 17 00:01:43 2010
New Revision: 1035864

URL: http://svn.apache.org/viewvc?rev=1035864&view=rev
Log:
add nodetool cfhistogram
patch by Pavel Yaskevich; reviewed by jbellis for CASSANDRA-1698

Modified:
    cassandra/branches/cassandra-0.7/   (props changed)
    cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java   (props changed)
    cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java   (props changed)
    cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java   (props changed)
    cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java   (props changed)
    cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java   (props changed)
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeCmd.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java

Propchange: cassandra/branches/cassandra-0.7/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 17 00:01:43 2010
@@ -1,4 +1,5 @@
 /cassandra/branches/cassandra-0.6:922689-1035020,1035656
+/cassandra/branches/cassandra-0.7:1035666
 /cassandra/trunk:1026516-1026734,1028929
 /incubator/cassandra/branches/cassandra-0.3:774578-796573
 /incubator/cassandra/branches/cassandra-0.4:810145-834239,834349-834350

Propchange: cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 17 00:01:43 2010
@@ -1,4 +1,5 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1035020,1035656
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1035666
 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1026734,1028929
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/Cassandra.java:774578-796573
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Cassandra.java:810145-834239,834349-834350

Propchange: cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 17 00:01:43 2010
@@ -1,4 +1,5 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1035020,1035656
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1035666
 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1026734,1028929
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/column_t.java:774578-792198
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Column.java:810145-834239,834349-834350

Propchange: cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 17 00:01:43 2010
@@ -1,4 +1,5 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1035020,1035656
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1035666
 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1026734,1028929
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:774578-796573
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:810145-834239,834349-834350

Propchange: cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 17 00:01:43 2010
@@ -1,4 +1,5 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1035020,1035656
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1035666
 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1026734,1028929
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:774578-796573
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:810145-834239,834349-834350

Propchange: cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Nov 17 00:01:43 2010
@@ -1,4 +1,5 @@
 /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1035020,1035656
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1035666
 /cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1026734,1028929
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/superColumn_t.java:774578-792198
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:810145-834239,834349-834350

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1035864&r1=1035863&r2=1035864&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Wed Nov 17 00:01:43 2010
@@ -1832,4 +1832,34 @@ public class ColumnFamilyStore implement
     {
         return ssTables.estimatedKeys();
     }
+
+    public long[] getEstimatedRowSizeHistogram()
+    {
+        long[] histogram = new long[90];
+
+        for (SSTableReader sstable : ssTables)
+        {
+            long[] rowSize = sstable.getEstimatedRowSize().get(false);
+
+            for (int i = 0; i < histogram.length; i++)
+                histogram[i] += rowSize[i];
+        }
+
+        return histogram;
+    }
+
+    public long[] getEstimatedColumnCountHistogram()
+    {
+        long[] histogram = new long[90];
+
+        for (SSTableReader sstable : ssTables)
+        {
+            long[] columnSize = sstable.getEstimatedColumnCount().get(false);
+
+            for (int i = 0; i < histogram.length; i++)
+                histogram[i] += columnSize[i];
+        }
+
+        return histogram;
+    }
 }

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java?rev=1035864&r1=1035863&r2=1035864&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java Wed Nov 17 00:01:43 2010
@@ -212,4 +212,7 @@ public interface ColumnFamilyStoreMBean
     public void setMemtableOperationsInMillions(double ops);
 
     public long estimateKeys();
+
+    public long[] getEstimatedRowSizeHistogram();
+    public long[] getEstimatedColumnCountHistogram();
 }

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeCmd.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeCmd.java?rev=1035864&r1=1035863&r2=1035864&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeCmd.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeCmd.java Wed Nov 17 00:01:43 2010
@@ -29,6 +29,7 @@ import java.util.*;
 import java.util.Map.Entry;
 import java.util.concurrent.ExecutionException;
 
+import org.apache.cassandra.utils.EstimatedHistogram;
 import org.apache.commons.cli.*;
 
 import org.apache.cassandra.cache.JMXInstrumentedCacheMBean;
@@ -72,7 +73,7 @@ public class NodeCmd {
                 "clearsnapshot, tpstats, flush, drain, repair, decommission, move, loadbalance, removetoken [status|force]|[token], " +
                 "setcachecapacity [keyspace] [cfname] [keycachecapacity] [rowcachecapacity], " +
                 "getcompactionthreshold [keyspace] [cfname], setcompactionthreshold [cfname] [minthreshold] [maxthreshold], " +
-                "netstats [host]");
+                "netstats [host], cfhistograms <keyspace> <column_family>");
         String usage = String.format("java %s --host <arg> <command>%n", NodeCmd.class.getName());
         hf.printHelp(usage, "", options, header);
     }
@@ -354,6 +355,36 @@ public class NodeCmd {
         outs.println("RemovalStatus: " + probe.getRemovalStatus());
     }
 
+    private void printCfHistograms(String keySpace, String columnFamily, PrintStream output)
+    {
+        ColumnFamilyStoreMBean store = this.probe.getCfsProxy(keySpace, columnFamily);
+
+        // default is 90 offsets
+        long[] offsets = new EstimatedHistogram(90).getBucketOffsets();
+
+        long[] rrlh = store.getRecentReadLatencyHistogramMicros();
+        long[] rwlh = store.getRecentWriteLatencyHistogramMicros();
+        long[] sprh = store.getRecentSSTablesPerReadHistogram();
+        long[] ersh = store.getEstimatedRowSizeHistogram();
+        long[] ecch = store.getEstimatedColumnCountHistogram();
+
+        output.println(String.format("%s/%s histograms", keySpace, columnFamily));
+
+        output.println(String.format("%-10s%10s%18s%18s%18s%18s",
+                                     "Offset", "SSTables", "Write Latency", "Read Latency", "Row Size", "Column Count"));
+
+        for (int i = 0; i < offsets.length; i++)
+        {
+            output.println(String.format("%-10d%10s%18s%18s%18s%18s",
+                                         offsets[i],
+                                         (i < sprh.length ? sprh[i] : ""),
+                                         (i < rrlh.length ? rrlh[i] : ""),
+                                         (i < rwlh.length ? rwlh[i] : ""),
+                                         (i < ersh.length ? ersh[i] : ""),
+                                         (i < ecch.length ? ecch[i] : "")));
+        }
+    }
+
     public static void main(String[] args) throws IOException, InterruptedException, ParseException
     {
         CommandLineParser parser = new PosixParser();
@@ -610,6 +641,16 @@ public class NodeCmd {
             String otherHost = arguments.length > 1 ? arguments[1] : null;
             nodeCmd.printNetworkStats(otherHost == null ? null : InetAddress.getByName(otherHost), System.out);
         }
+        else if (cmdName.equals("cfhistograms"))
+        {
+            if (arguments.length < 3)
+            {
+                System.err.println("Usage of cfhistograms: <keyspace> <column_family>.");
+                System.exit(1);
+            }
+
+            nodeCmd.printCfHistograms(arguments[1], arguments[2], System.out);
+        }
         else if (cmdName.equals("version"))
         {
             nodeCmd.printReleaseVersion(System.out);

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=1035864&r1=1035863&r2=1035864&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/tools/NodeProbe.java Wed Nov 17 00:01:43 2010
@@ -452,17 +452,21 @@ public class NodeProbe
         }
     }
     
-    private ColumnFamilyStoreMBean getCfsProxy(String ks, String cf) {
+    public ColumnFamilyStoreMBean getCfsProxy(String ks, String cf)
+    {
         ColumnFamilyStoreMBean cfsProxy = null;
-        try {
+        try
+        {
             cfsProxy = JMX.newMBeanProxy(mbeanServerConn,
                     new ObjectName("org.apache.cassandra.db:type=ColumnFamilies,keyspace="+ks+",columnfamily="+cf), 
                     ColumnFamilyStoreMBean.class);
         }
-        catch (MalformedObjectNameException mone) {
+        catch (MalformedObjectNameException mone)
+        {
             System.err.println("ColumnFamilyStore for " + ks + "/" + cf + " not found.");
             System.exit(1);
         }
+
         return cfsProxy;
     }
 }