You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2011/12/23 17:25:20 UTC

svn commit: r1222728 - in /cassandra/trunk: CHANGES.txt src/java/org/apache/cassandra/db/Memtable.java src/java/org/apache/cassandra/db/RowIteratorFactory.java

Author: slebresne
Date: Fri Dec 23 16:25:19 2011
New Revision: 1222728

URL: http://svn.apache.org/viewvc?rev=1222728&view=rev
Log:
Optimize memtable iteration during range scan
patch by slebresne; reviewed by jbellis for CASSANDRA-3638

Modified:
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
    cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1222728&r1=1222727&r2=1222728&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Fri Dec 23 16:25:19 2011
@@ -29,6 +29,7 @@
  * fsync the directory after new sstable or commitlog segment are created (CASSANDRA-3250)
  * fix minor issues reported by FindBugs (CASSANDRA-3658)
  * global key/row caches (CASSANDRA-3143)
+ * optimize memtable iteration during range scan (CASSANDRA-3638)
 
 1.0.7
  * add nodetool setstreamthroughput (CASSANDRA-3571)

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java?rev=1222728&r1=1222727&r2=1222728&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java Fri Dec 23 16:25:19 2011
@@ -309,11 +309,13 @@ public class Memtable
      * @param startWith Include data in the result from and including this key and to the end of the memtable
      * @return An iterator of entries with the data from the start key 
      */
-    public Iterator<Map.Entry<DecoratedKey, ColumnFamily>> getEntryIterator(final RowPosition startWith)
+    public Iterator<Map.Entry<DecoratedKey, ColumnFamily>> getEntryIterator(final RowPosition startWith, final RowPosition stopAt)
     {
         return new Iterator<Map.Entry<DecoratedKey, ColumnFamily>>()
         {
-            private Iterator<Map.Entry<RowPosition, ColumnFamily>> iter = columnFamilies.tailMap(startWith).entrySet().iterator();
+            private Iterator<Map.Entry<RowPosition, ColumnFamily>> iter = stopAt.isMinimum()
+                                                                        ? columnFamilies.tailMap(startWith).entrySet().iterator()
+                                                                        : columnFamilies.subMap(startWith, true, stopAt, true).entrySet().iterator();
 
             public boolean hasNext()
             {

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java?rev=1222728&r1=1222727&r2=1222728&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/RowIteratorFactory.java Fri Dec 23 16:25:19 2011
@@ -65,21 +65,11 @@ public class RowIteratorFactory
     {
         // fetch data from current memtable, historical memtables, and SSTables in the correct order.
         final List<CloseableIterator<IColumnIterator>> iterators = new ArrayList<CloseableIterator<IColumnIterator>>();
-        // we iterate through memtables with a priority queue to avoid more sorting than necessary.
-        // this predicate throws out the rows before the start of our range.
-        Predicate<IColumnIterator> p = new Predicate<IColumnIterator>()
-        {
-            public boolean apply(IColumnIterator row)
-            {
-                return startWith.compareTo(row.getKey()) <= 0
-                       && (stopAt.isMinimum() || row.getKey().compareTo(stopAt) <= 0);
-            }
-        };
 
         // memtables
         for (Memtable memtable : memtables)
         {
-            iterators.add(new ConvertToColumnIterator(filter, p, memtable.getEntryIterator(startWith)));
+            iterators.add(new ConvertToColumnIterator(filter, memtable.getEntryIterator(startWith, stopAt)));
         }
 
         for (SSTableReader sstable : sstables)
@@ -139,24 +129,20 @@ public class RowIteratorFactory
     private static class ConvertToColumnIterator extends AbstractIterator<IColumnIterator> implements CloseableIterator<IColumnIterator>
     {
         private final QueryFilter filter;
-        private final Predicate<IColumnIterator> pred;
         private final Iterator<Map.Entry<DecoratedKey, ColumnFamily>> iter;
 
-        public ConvertToColumnIterator(QueryFilter filter, Predicate<IColumnIterator> pred, Iterator<Map.Entry<DecoratedKey, ColumnFamily>> iter)
+        public ConvertToColumnIterator(QueryFilter filter, Iterator<Map.Entry<DecoratedKey, ColumnFamily>> iter)
         {
             this.filter = filter;
-            this.pred = pred;
             this.iter = iter;
         }
 
         public IColumnIterator computeNext()
         {
-            while (iter.hasNext())
+            if (iter.hasNext())
             {
                 Map.Entry<DecoratedKey, ColumnFamily> entry = iter.next();
-                IColumnIterator ici = filter.getMemtableColumnIterator(entry.getValue(), entry.getKey());
-                if (pred.apply(ici))
-                    return ici;
+                return filter.getMemtableColumnIterator(entry.getValue(), entry.getKey());
             }
             return endOfData();
         }