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/06/29 17:26:30 UTC
svn commit: r1141134 - in /cassandra/branches/cassandra-0.8: ./ contrib/
interface/thrift/gen-java/org/apache/cassandra/thrift/
src/java/org/apache/cassandra/db/
Author: slebresne
Date: Wed Jun 29 15:26:29 2011
New Revision: 1141134
URL: http://svn.apache.org/viewvc?rev=1141134&view=rev
Log:
merge from 0.7
Modified:
cassandra/branches/cassandra-0.8/ (props changed)
cassandra/branches/cassandra-0.8/CHANGES.txt
cassandra/branches/cassandra-0.8/contrib/ (props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java (props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java (props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java (props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java (props changed)
cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java (props changed)
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
Propchange: cassandra/branches/cassandra-0.8/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 29 15:26:29 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7:1026516-1140567,1140928
+/cassandra/branches/cassandra-0.7:1026516-1140567,1140928,1141129
/cassandra/branches/cassandra-0.7.0:1053690-1055654
/cassandra/branches/cassandra-0.8:1090934-1125013,1125041
/cassandra/branches/cassandra-0.8.0:1125021-1130369
Modified: cassandra/branches/cassandra-0.8/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1141134&r1=1141133&r2=1141134&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.8/CHANGES.txt Wed Jun 29 15:26:29 2011
@@ -85,6 +85,7 @@
* Fix wrong purge of deleted cf during compaction (CASSANDRA-2786)
* fix race that could result in Hadoop writer failing to throw an
exception encountered after close() (CASSANDRA-2755)
+ * fix scan wrongly throwing assertion error (CASSANDRA-2653)
0.8.0-final
Propchange: cassandra/branches/cassandra-0.8/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 29 15:26:29 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
-/cassandra/branches/cassandra-0.7/contrib:1026516-1140567,1140928
+/cassandra/branches/cassandra-0.7/contrib:1026516-1140567,1140928,1141129
/cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125041
/cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
Propchange: cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 29 15:26:29 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1140567,1140928
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1140567,1140928,1141129
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125041
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
Propchange: cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 29 15:26:29 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1140567,1140928
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1140567,1140928,1141129
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125041
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
Propchange: cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 29 15:26:29 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1140567,1140928
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1140567,1140928,1141129
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125041
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
Propchange: cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 29 15:26:29 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1140567,1140928
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1140567,1140928,1141129
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125041
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
Propchange: cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Jun 29 15:26:29 2011
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1140567,1140928
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1140567,1140928,1141129
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125041
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1141134&r1=1141133&r2=1141134&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Wed Jun 29 15:26:29 2011
@@ -1407,6 +1407,16 @@ public class ColumnFamilyStore implement
return rows;
}
+ private NamesQueryFilter getExtraFilter(IndexClause clause)
+ {
+ SortedSet<ByteBuffer> columns = new TreeSet<ByteBuffer>(getComparator());
+ for (IndexExpression expr : clause.expressions)
+ {
+ columns.add(expr.column_name);
+ }
+ return new NamesQueryFilter(columns);
+ }
+
public List<Row> scan(IndexClause clause, AbstractBounds range, IFilter dataFilter)
{
// Start with the most-restrictive indexed clause, then apply remaining clauses
@@ -1423,50 +1433,33 @@ public class ColumnFamilyStore implement
// it needs to be expanded to include those too
IFilter firstFilter = dataFilter;
NamesQueryFilter extraFilter = null;
- if (clause.expressions.size() > 1)
+ if (dataFilter instanceof SliceQueryFilter)
{
- if (dataFilter instanceof SliceQueryFilter)
+ // if we have a high chance of getting all the columns in a single index slice, do that.
+ // otherwise, we'll create an extraFilter (lazily) to fetch by name the columns referenced by the additional expressions.
+ if (getMaxRowSize() < DatabaseDescriptor.getColumnIndexSize())
{
- // if we have a high chance of getting all the columns in a single index slice, do that.
- // otherwise, create an extraFilter to fetch by name the columns referenced by the additional expressions.
- if (getMaxRowSize() < DatabaseDescriptor.getColumnIndexSize())
- {
- logger.debug("Expanding slice filter to entire row to cover additional expressions");
- firstFilter = new SliceQueryFilter(ByteBufferUtil.EMPTY_BYTE_BUFFER,
- ByteBufferUtil.EMPTY_BYTE_BUFFER,
- ((SliceQueryFilter) dataFilter).reversed,
- Integer.MAX_VALUE);
- }
- else
- {
- logger.debug("adding extraFilter to cover additional expressions");
- SortedSet<ByteBuffer> columns = new TreeSet<ByteBuffer>(getComparator());
- for (IndexExpression expr : clause.expressions)
- {
- if (expr == primary)
- continue;
- columns.add(expr.column_name);
- }
- extraFilter = new NamesQueryFilter(columns);
- }
+ logger.debug("Expanding slice filter to entire row to cover additional expressions");
+ firstFilter = new SliceQueryFilter(ByteBufferUtil.EMPTY_BYTE_BUFFER,
+ ByteBufferUtil.EMPTY_BYTE_BUFFER,
+ ((SliceQueryFilter) dataFilter).reversed,
+ Integer.MAX_VALUE);
}
- else
+ }
+ else
+ {
+ logger.debug("adding columns to firstFilter to cover additional expressions");
+ // just add in columns that are not part of the resultset
+ assert dataFilter instanceof NamesQueryFilter;
+ SortedSet<ByteBuffer> columns = new TreeSet<ByteBuffer>(getComparator());
+ for (IndexExpression expr : clause.expressions)
{
- logger.debug("adding columns to firstFilter to cover additional expressions");
- // just add in columns that are not part of the resultset
- assert dataFilter instanceof NamesQueryFilter;
- SortedSet<ByteBuffer> columns = new TreeSet<ByteBuffer>(getComparator());
- for (IndexExpression expr : clause.expressions)
- {
- if (expr == primary || ((NamesQueryFilter) dataFilter).columns.contains(expr.column_name))
- continue;
- columns.add(expr.column_name);
- }
- if (columns.size() > 0)
- {
- columns.addAll(((NamesQueryFilter) dataFilter).columns);
- firstFilter = new NamesQueryFilter(columns);
- }
+ columns.add(expr.column_name);
+ }
+ if (columns.size() > 0)
+ {
+ columns.addAll(((NamesQueryFilter) dataFilter).columns);
+ firstFilter = new NamesQueryFilter(columns);
}
}
@@ -1521,18 +1514,23 @@ public class ColumnFamilyStore implement
// get the row columns requested, and additional columns for the expressions if necessary
ColumnFamily data = getColumnFamily(new QueryFilter(dk, path, firstFilter));
- assert data != null : String.format("No data found for %s in %s:%s (original filter %s) from expression %s",
- firstFilter, dk, path, dataFilter, expressionString(primary));
+ // While we the column family we'll get in the end should contains the primary clause column, the firstFilter may not have found it.
+ if (data == null)
+ data = ColumnFamily.create(metadata);
logger.debug("fetched data row {}", data);
- if (extraFilter != null)
+ if (dataFilter instanceof SliceQueryFilter)
{
// we might have gotten the expression columns in with the main data slice, but
// we can't know for sure until that slice is done. So, we'll do the extra query
// if we go through and any expression columns are not present.
for (IndexExpression expr : clause.expressions)
{
- if (expr != primary && data.getColumn(expr.column_name) == null)
+ if (data.getColumn(expr.column_name) == null)
{
+ logger.debug("adding extraFilter to cover additional expressions");
+ // Lazily creating extra filter
+ if (extraFilter == null)
+ extraFilter = getExtraFilter(clause);
data.addAll(getColumnFamily(new QueryFilter(dk, path, extraFilter)));
break;
}
@@ -1596,11 +1594,10 @@ public class ColumnFamilyStore implement
private static boolean satisfies(ColumnFamily data, IndexClause clause, IndexExpression first)
{
+ // We enforces even the primary clause because reads are not synchronized with writes and it is thus possible to have a race
+ // where the index returned a row which doesn't have the primarycolumn when we actually read it
for (IndexExpression expression : clause.expressions)
{
- // (we can skip "first" since we already know it's satisfied)
- if (expression == first)
- continue;
// check column data vs expression
IColumn column = data.getColumn(expression.column_name);
if (column == null)