Author: jbellis
Date: Tue Jul 20 02:18:36 2010
New Revision: 965714
URL: http://svn.apache.org/viewvc?rev=965714&view=rev
Log:
handle subcolumn queries in cache fast-path, fixing system test regressions
introduced in CASSANDRA-1267. patch by jbellis
Modified:
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
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=965714&r1=965713&r2=965714&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Tue
Jul 20 02:18:36 2010
@@ -837,13 +837,35 @@ public class ColumnFamilyStore implement
// we can skip the filter step entirely, and we can help out
removeDeleted by re-caching the result
// if any tombstones have aged out since last time. (This means
that the row cache will treat gcBefore as
// max(gcBefore, all previous gcBefore), which is fine for
correctness.)
+ //
+ // But, if the filter is asking for less columns than we have
cached, we fall back to the slow path
+ // since we have to copy out a subset.
if (filter.filter instanceof SliceQueryFilter)
{
SliceQueryFilter sliceFilter = (SliceQueryFilter)
filter.filter;
- if (sliceFilter.start.length == 0 && sliceFilter.finish.length
== 0 && sliceFilter.count > cached.getColumnCount())
+ if (sliceFilter.start.length == 0 && sliceFilter.finish.length
== 0)
{
- removeDeletedColumnsOnly(cached, gcBefore);
- return removeDeletedCF(cached, gcBefore);
+ if (cached.isSuper() && filter.path.superColumnName !=
null)
+ {
+ // subcolumns from named supercolumn
+ IColumn sc =
cached.getColumn(filter.path.superColumnName);
+ if (sc == null || sliceFilter.count >=
sc.getSubColumns().size())
+ {
+ ColumnFamily cf = cached.cloneMeShallow();
+ if (sc != null)
+ cf.addColumn(sc);
+ return removeDeleted(cf, gcBefore);
+ }
+ }
+ else
+ {
+ // top-level columns
+ if (sliceFilter.count >= cached.getColumnCount())
+ {
+ removeDeletedColumnsOnly(cached, gcBefore);
+ return removeDeletedCF(cached, gcBefore);
+ }
+ }
}
}