Author: jbellis
Date: Thu Nov 18 07:19:16 2010
New Revision: 1036330

URL: http://svn.apache.org/viewvc?rev=1036330&view=rev
Log:
merge from 0.7

Modified:
    cassandra/trunk/   (props changed)
    cassandra/trunk/CHANGES.txt
    
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
   (props changed)
    
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
   (props changed)
    
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
   (props changed)
    
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
   (props changed)
    
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
   (props changed)
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
    
cassandra/trunk/src/java/org/apache/cassandra/service/AntiEntropyService.java
    cassandra/trunk/src/java/org/apache/cassandra/streaming/PendingFile.java
    cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamOut.java
    cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
    cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java
    
cassandra/trunk/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java
    cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java

Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 18 07:19:16 2010
@@ -1,5 +1,5 @@
-/cassandra/branches/cassandra-0.6:922689-1035020,1035656
-/cassandra/branches/cassandra-0.7:1026517-1035659
+/cassandra/branches/cassandra-0.6:922689-1036176
+/cassandra/branches/cassandra-0.7:1026517-1036329
 /incubator/cassandra/branches/cassandra-0.3:774578-796573
 /incubator/cassandra/branches/cassandra-0.4:810145-834239,834349-834350
 /incubator/cassandra/branches/cassandra-0.5:888872-915439

Modified: cassandra/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Thu Nov 18 07:19:16 2010
@@ -2,6 +2,11 @@ dev
  * add clustertool, config-converter, sstablekeys, and schematool 
    Windows .bat files (CASSANDRA-1723)
  * reject range queries received during bootstrap (CASSANDRA-1739)
+ * fix wrapping-range queries on non-minimum token (CASSANDRA-1700)
+ * add nodetool cfhistogram (CASSANDRA-1698)
+ * limit repaired ranges to what the nodes have in common (CASSANDRA-1674)
+ * index scan treats missing columns as not matching secondary
+   expressions (CASSANDRA-1745)
  * Update windows .bat files to work outside of main Cassandra
    directory (CASSANDRA-1713)
  * log threshold causing memtable flush (CASSANDRA-1675)
@@ -32,6 +37,8 @@ dev
  * fix tombstoning of supercolumns in range queries (CASSANDRA-1734)
  * clear endpoint cache after updating keyspace metadata (CASSANDRA-1741)
  * fix wrapping-range queries on non-minimum token (CASSANDRA-1700)
+ * truncate includes secondary indexes (CASSANDRA-1747)
+ * retain reference to PendingFile sstables (CASSANDRA-1749)
 
 
 0.7.0-beta3

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 18 07:19:16 2010
@@ -1,5 +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:1026517-1035659
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1036176
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026517-1036329
 
/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
 
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Cassandra.java:888872-903502

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 18 07:19:16 2010
@@ -1,5 +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:1026517-1035659
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1036176
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026517-1036329
 
/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
 
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Column.java:888872-903502

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 18 07:19:16 2010
@@ -1,5 +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:1026517-1035659
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1036176
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026517-1036329
 
/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
 
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:888872-903502

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 18 07:19:16 2010
@@ -1,5 +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:1026517-1035659
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1036176
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026517-1036329
 
/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
 
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:888872-903502

Propchange: 
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Nov 18 07:19:16 2010
@@ -1,5 +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:1026517-1035659
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1036176
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026517-1036329
 
/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
 
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:888872-903502

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Thu 
Nov 18 07:19:16 2010
@@ -1435,7 +1435,7 @@ public class ColumnFamilyStore implement
             // check column data vs expression
             IColumn column = data.getColumn(expression.column_name);
             if (column == null)
-                continue;
+                return false;
             int v = data.getComparator().compare(column.value(), 
expression.value);
             if (!satisfies(v, expression.op))
                 return false;
@@ -1640,13 +1640,16 @@ public class ColumnFamilyStore implement
             {
                 // putting markCompacted on the commitlogUpdater thread 
ensures it will run
                 // after any compactions that were in progress when truncate 
was called, are finished
-                List<SSTableReader> truncatedSSTables = new 
ArrayList<SSTableReader>();
-                for (SSTableReader sstable : ssTables.getSSTables())
+                for (ColumnFamilyStore cfs : 
Iterables.concat(indexedColumns.values(), 
Arrays.asList(ColumnFamilyStore.this)))
                 {
-                    if (!sstable.newSince(truncatedAt))
-                        truncatedSSTables.add(sstable);
+                    List<SSTableReader> truncatedSSTables = new 
ArrayList<SSTableReader>();
+                    for (SSTableReader sstable : cfs.getSSTables())
+                    {
+                        if (!sstable.newSince(truncatedAt))
+                            truncatedSSTables.add(sstable);
+                    }
+                    cfs.markCompacted(truncatedSSTables);
                 }
-                markCompacted(truncatedSSTables);
 
                 // Invalidate row cache
                 invalidateRowCache();
@@ -1832,4 +1835,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/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java 
Thu Nov 18 07:19:16 2010
@@ -212,4 +212,7 @@ public interface ColumnFamilyStoreMBean
     public void setMemtableOperationsInMillions(double ops);
 
     public long estimateKeys();
+
+    public long[] getEstimatedRowSizeHistogram();
+    public long[] getEstimatedColumnCountHistogram();
 }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/service/AntiEntropyService.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/AntiEntropyService.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/service/AntiEntropyService.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/service/AntiEntropyService.java 
Thu Nov 18 07:19:16 2010
@@ -433,14 +433,14 @@ public class AntiEntropyService
         public final TreeRequest request;
         public final MerkleTree ltree;
         public final MerkleTree rtree;
-        public final List<MerkleTree.TreeRange> differences;
+        public final List<Range> differences;
 
         public Differencer(TreeRequest request, MerkleTree ltree, MerkleTree 
rtree)
         {
             this.request = request;
             this.ltree = ltree;
             this.rtree = rtree;
-            differences = new ArrayList<MerkleTree.TreeRange>();
+            differences = new ArrayList<Range>();
         }
 
         /**
@@ -461,31 +461,22 @@ public class AntiEntropyService
             Set<Range> interesting = new 
HashSet(ss.getRangesForEndpoint(request.cf.left, local));
             interesting.retainAll(ss.getRangesForEndpoint(request.cf.left, 
request.endpoint));
 
-            // compare trees, and filter out uninteresting differences
+            // compare trees, and collect interesting differences
             for (MerkleTree.TreeRange diff : MerkleTree.difference(ltree, 
rtree))
-            {
                 for (Range localrange: interesting)
-                {
-                    if (diff.intersects(localrange))
-                    {
-                        differences.add(diff);
-                        break; // the inner loop
-                    }
-                }
-            }
+                    differences.addAll(diff.intersectionWith(localrange));
             
             // choose a repair method based on the significance of the 
difference
-            float difference = differenceFraction();
-            String format = "Endpoints " + local + " and " + request.endpoint 
+ " are %s for " + request.cf;
-            if (difference == 0.0)
+            String format = "Endpoints " + local + " and " + request.endpoint 
+ " %s for " + request.cf;
+            if (differences.isEmpty())
             {
-                logger.info(String.format(format, "consistent"));
+                logger.info(String.format(format, "are consistent"));
                 AntiEntropyService.instance.completedRequest(request);
                 return;
             }
 
             // non-0 difference: perform streaming repair
-            logger.info(String.format(format, (difference * 100) + "% out of 
sync"));
+            logger.info(String.format(format, "have " + differences.size() + " 
range(s) out of sync"));
             try
             {
                 performStreamingRepair();
@@ -497,18 +488,6 @@ public class AntiEntropyService
         }
         
         /**
-         * @return the fraction of the keyspace that is different, as 
represented by our
-         * list of different ranges. A range at depth 0 == 1.0, at depth 1 == 
0.5, etc.
-         */
-        float differenceFraction()
-        {
-            double fraction = 0.0;
-            for (MerkleTree.TreeRange diff : differences)
-                fraction += 1.0 / Math.pow(2, diff.depth);
-            return (float)fraction;
-        }
-
-        /**
          * Starts sending/receiving our list of differences to/from the remote 
endpoint: creates a callback
          * that will be called out of band once the streams complete.
          */

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/streaming/PendingFile.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/streaming/PendingFile.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/streaming/PendingFile.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/streaming/PendingFile.java 
Thu Nov 18 07:19:16 2010
@@ -31,6 +31,7 @@ import org.apache.commons.lang.StringUti
 
 import org.apache.cassandra.io.ICompactSerializer;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SSTable;
 import org.apache.cassandra.utils.Pair;
 
 /**
@@ -45,6 +46,9 @@ public class PendingFile
         return serializer_;
     }
 
+    // NB: this reference prevents garbage collection of the sstable on the 
source node
+    private final SSTable sstable;
+
     public final Descriptor desc;
     public final String component;
     public final List<Pair<Long,Long>> sections;
@@ -53,11 +57,12 @@ public class PendingFile
 
     public PendingFile(Descriptor desc, PendingFile pf)
     {
-        this(desc, pf.component, pf.sections);
+        this(null, desc, pf.component, pf.sections);
     }
 
-    public PendingFile(Descriptor desc, String component, 
List<Pair<Long,Long>> sections)
+    public PendingFile(SSTable sstable, Descriptor desc, String component, 
List<Pair<Long,Long>> sections)
     {
+        this.sstable = sstable;
         this.desc = desc;
         this.component = component;
         this.sections = sections;
@@ -124,7 +129,7 @@ public class PendingFile
             List<Pair<Long,Long>> sections = new 
ArrayList<Pair<Long,Long>>(count);
             for (int i = 0; i < count; i++)
                 sections.add(new Pair<Long,Long>(Long.valueOf(dis.readLong()), 
Long.valueOf(dis.readLong())));
-            return new PendingFile(desc, component, sections);
+            return new PendingFile(null, desc, component, sections);
         }
     }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamOut.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamOut.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamOut.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/streaming/StreamOut.java Thu 
Nov 18 07:19:16 2010
@@ -166,7 +166,7 @@ public class StreamOut
             List<Pair<Long,Long>> sections = 
sstable.getPositionsForRanges(ranges);
             if (sections.isEmpty())
                 continue;
-            pending.add(new PendingFile(desc, SSTable.COMPONENT_DATA, 
sections));
+            pending.add(new PendingFile(sstable, desc, SSTable.COMPONENT_DATA, 
sections));
         }
         logger.info("Stream context metadata {}, {} sstables.", pending, 
sstables.size());
         return pending;

Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java Thu Nov 18 
07:19:16 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/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java Thu Nov 
18 07:19:16 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;
     }
 }

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- 
cassandra/trunk/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java
 (original)
+++ 
cassandra/trunk/test/unit/org/apache/cassandra/service/AntiEntropyServiceTest.java
 Thu Nov 18 07:19:16 2010
@@ -82,7 +82,7 @@ public class AntiEntropyServiceTest exte
         aes = AntiEntropyService.instance;
         TokenMetadata tmd = StorageService.instance.getTokenMetadata();
         tmd.clearUnsafe();
-        
tmd.updateNormalToken(StorageService.getPartitioner().getRandomToken(), LOCAL);
+        
StorageService.instance.setToken(StorageService.getPartitioner().getRandomToken());
         
tmd.updateNormalToken(StorageService.getPartitioner().getMinimumToken(), 
REMOTE);
         assert tmd.isMember(REMOTE);
         
@@ -210,19 +210,23 @@ public class AntiEntropyServiceTest exte
         validator.complete();
         MerkleTree rtree = validator.tree;
 
-        // change a range in one of the trees
-        Token min = StorageService.instance.getPartitioner().getMinimumToken();
-        ltree.invalidate(min);
-        MerkleTree.TreeRange changed = ltree.invalids(new Range(min, 
min)).next();
+        // change a range we own in one of the trees
+        Token ltoken = StorageService.instance.getLocalToken();
+        ltree.invalidate(ltoken);
+        MerkleTree.TreeRange changed = 
ltree.invalids(StorageService.instance.getLocalPrimaryRange()).next();
         changed.hash("non-empty hash!".getBytes());
+        // the changed range has two halves, split on our local token: both 
will be repaired
+        // (since this keyspace has RF > N, so every node is responsible for 
the entire ring)
+        Set<Range> interesting = new HashSet<Range>();
+        interesting.add(new Range(changed.left, ltoken));
+        interesting.add(new Range(ltoken, changed.right));
 
         // difference the trees
         Differencer diff = new Differencer(request, ltree, rtree);
         diff.run();
         
         // ensure that the changed range was recorded
-        assertEquals("Wrong number of differing ranges", 1, 
diff.differences.size());
-        assertEquals("Wrong differing range", changed, 
diff.differences.get(0));
+        assertEquals("Wrong differing ranges", interesting, new 
HashSet<Range>(diff.differences));
     }
 
     Set<InetAddress> addTokens(int max) throws Throwable

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java?rev=1036330&r1=1036329&r2=1036330&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java 
(original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/streaming/BootstrapTest.java 
Thu Nov 18 07:19:16 2010
@@ -37,7 +37,7 @@ public class BootstrapTest extends Schem
     public void testGetNewNames() throws IOException
     {
         Descriptor desc = Descriptor.fromFilename(new File("Keyspace1", 
"Standard1-500-Data.db").toString());
-        PendingFile inContext = new PendingFile(desc, "Data.db", 
Arrays.asList(new Pair<Long,Long>(0L, 1L)));
+        PendingFile inContext = new PendingFile(null, desc, "Data.db", 
Arrays.asList(new Pair<Long,Long>(0L, 1L)));
 
         PendingFile outContext = StreamIn.getContextMapping(inContext);
         // filename and generation are expected to have changed


Reply via email to