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 2011/09/22 22:08:07 UTC

svn commit: r1174361 - in /cassandra/branches/cassandra-1.0.0: src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/db/compaction/ src/java/org/apache/cassandra/db/filter/ src/java/org/apache/cassandra/io/sstable/ src/java/org/apache/cassand...

Author: jbellis
Date: Thu Sep 22 20:08:06 2011
New Revision: 1174361

URL: http://svn.apache.org/viewvc?rev=1174361&view=rev
Log:
add TrivialOneToOne MergeIterator optimization
patch by jbellis; tested by brandonwilliams for CASSANDRA-3234

Modified:
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/RowIteratorFactory.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/ParallelCompactionIterable.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/filter/QueryFilter.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/service/RangeSliceResponseResolver.java
    cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/utils/MergeIterator.java
    cassandra/branches/cassandra-1.0.0/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/RowIteratorFactory.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/RowIteratorFactory.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/RowIteratorFactory.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/RowIteratorFactory.java Thu Sep 22 20:08:06 2011
@@ -100,6 +100,11 @@ public class RowIteratorFactory
             private DecoratedKey key;
             private ColumnFamily returnCF;
 
+            public boolean trivialReduceIsTrivial()
+            {
+                return false;
+            }
+
             @Override
             protected void onKeyChange()
             {

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/CompactionIterable.java Thu Sep 22 20:08:06 2011
@@ -88,6 +88,11 @@ public class CompactionIterable extends 
     {
         protected final List<SSTableIdentityIterator> rows = new ArrayList<SSTableIdentityIterator>();
 
+        public boolean trivialReduceIsTrivial()
+        {
+            return false;
+        }
+
         public void reduce(IColumnIterator current)
         {
             rows.add((SSTableIdentityIterator) current);

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/LazilyCompactedRow.java Thu Sep 22 20:08:06 2011
@@ -215,6 +215,11 @@ public class LazilyCompactedRow extends 
         int size = 0;
         long maxTimestampSeen = Long.MIN_VALUE;
 
+        public boolean trivialReduceIsTrivial()
+        {
+            return true;
+        }
+
         public void reduce(IColumn current)
         {
             container.addColumn(current);

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/ParallelCompactionIterable.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/ParallelCompactionIterable.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/ParallelCompactionIterable.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/compaction/ParallelCompactionIterable.java Thu Sep 22 20:08:06 2011
@@ -148,6 +148,11 @@ public class ParallelCompactionIterable 
         private final ThreadPoolExecutor executor;
         private int row = 0;
 
+        public boolean trivialReduceIsTrivial()
+        {
+            return false;
+        }
+
         private Reducer()
         {
             super();

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/filter/QueryFilter.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/filter/QueryFilter.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/filter/QueryFilter.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/db/filter/QueryFilter.java Thu Sep 22 20:08:06 2011
@@ -97,6 +97,11 @@ public class QueryFilter
         {
             ColumnFamily curCF = returnCF.cloneMeShallow();
 
+            public boolean trivialReduceIsTrivial()
+            {
+                return true;
+            }
+
             protected boolean isEqual(IColumn o1, IColumn o2)
             {
                 return o1.name().equals(o2.name());

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/io/sstable/ReducingKeyIterator.java Thu Sep 22 20:08:06 2011
@@ -43,6 +43,11 @@ public class ReducingKeyIterator impleme
         {
             DecoratedKey<?> reduced = null;
 
+            public boolean trivialReduceIsTrivial()
+            {
+                return true;
+            }
+
             public void reduce(DecoratedKey current)
             {
                 reduced = current;

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/service/RangeSliceResponseResolver.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/service/RangeSliceResponseResolver.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/service/RangeSliceResponseResolver.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/service/RangeSliceResponseResolver.java Thu Sep 22 20:08:06 2011
@@ -141,6 +141,11 @@ public class RangeSliceResponseResolver 
         List<InetAddress> versionSources = new ArrayList<InetAddress>(sources.size());
         DecoratedKey key;
 
+        public boolean trivialReduceIsTrivial()
+        {
+            return false;
+        }
+
         public void reduce(Pair<Row,InetAddress> current)
         {
             key = current.left.key;

Modified: cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/utils/MergeIterator.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/utils/MergeIterator.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/utils/MergeIterator.java (original)
+++ cassandra/branches/cassandra-1.0.0/src/java/org/apache/cassandra/utils/MergeIterator.java Thu Sep 22 20:08:06 2011
@@ -42,7 +42,9 @@ public abstract class MergeIterator<In,O
     {
         assert !sources.isEmpty();
         if (sources.size() == 1)
-            return new OneToOne<In, Out>(sources, reducer);
+            return reducer.trivialReduceIsTrivial()
+                   ? new TrivialOneToOne<In, Out>(sources, reducer)
+                   : new OneToOne<In, Out>(sources, reducer);
         return new ManyToOne<In, Out>(sources, comparator, reducer);
     }
 
@@ -157,6 +159,11 @@ public abstract class MergeIterator<In,O
     public static abstract class Reducer<In,Out>
     {
         /**
+         * @return true if Out is the same as In for the case of a single source iterator
+         */
+        public abstract boolean trivialReduceIsTrivial();
+
+        /**
          * combine this object with the previous ones.
          * intermediate state is up to your implementation.
          */
@@ -191,4 +198,22 @@ public abstract class MergeIterator<In,O
             return reducer.getReduced();
         }
     }
+
+    private static class TrivialOneToOne<In, Out> extends MergeIterator<In, Out>
+    {
+        private final CloseableIterator<?> source;
+
+        public TrivialOneToOne(List<? extends CloseableIterator<In>> sources, Reducer<In, Out> reducer)
+        {
+            super(sources, reducer);
+            source = sources.get(0);
+        }
+
+        protected Out computeNext()
+        {
+            if (!source.hasNext())
+                return endOfData();
+            return (Out) source.next();
+        }
+    }
 }

Modified: cassandra/branches/cassandra-1.0.0/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-1.0.0/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java?rev=1174361&r1=1174360&r2=1174361&view=diff
==============================================================================
--- cassandra/branches/cassandra-1.0.0/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java (original)
+++ cassandra/branches/cassandra-1.0.0/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java Thu Sep 22 20:08:06 2011
@@ -50,6 +50,12 @@ public class MergeIteratorTest
         MergeIterator.Reducer<String,String> reducer = new MergeIterator.Reducer<String,String>()
         {
             String concatted = "";
+
+            public boolean trivialReduceIsTrivial()
+            {
+                return false; // technically true, but let's not optimize anything away here...
+            }
+
             public void reduce(String value)
             {
                 concatted += value;