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;