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